Trước tiên, chúng tôi cần biết những gì bạn đã biết về người dùng. Rõ ràng, bạn có tên người dùng và mật khẩu cũ. Bạn còn biết cái gì nữa? Bạn có địa chỉ email nào không? Bạn có dữ liệu về loài hoa yêu thích của người dùng không?
Giả sử bạn có tên người dùng, mật khẩu và địa chỉ email đang hoạt động, bạn cần thêm hai trường vào bảng người dùng của mình (giả sử đó là bảng cơ sở dữ liệu): một ngày gọi là new_passwd_expire và một chuỗi new_passwd_id.
Giả sử bạn có địa chỉ email của người dùng, khi ai đó yêu cầu đặt lại mật khẩu, bạn cập nhật bảng người dùng như sau:
new_passwd_expire = now() + some number of days
new_passwd_id = some random string of characters (see below)
Tiếp theo, bạn gửi email cho người dùng theo địa chỉ đó:
Gửi so-and-so
Ai đó đã yêu cầu mật khẩu mới cho tài khoản người dùng <tên người dùng> tại <tên trang web của bạn>. Nếu bạn đã yêu cầu đặt lại mật khẩu này, hãy nhấp vào liên kết sau:
http://example.com/yourscript.lang?update= < new_password_id >
Nếu liên kết đó không hoạt động, bạn có thể truy cập http://example.com/yourscript.lang và nhập thông tin sau vào biểu mẫu: <new_password_id>
Nếu bạn không yêu cầu đặt lại mật khẩu, bạn có thể bỏ qua email này.
Cảm ơn, yada yada
Bây giờ, mã hóa yourcript.lang: Tập lệnh này cần một biểu mẫu. Nếu bản cập nhật var được chuyển qua URL, biểu mẫu chỉ yêu cầu tên người dùng và địa chỉ email của người dùng. Nếu cập nhật không được thông qua, nó sẽ yêu cầu tên người dùng, địa chỉ email và mã id được gửi trong email. Bạn cũng yêu cầu một mật khẩu mới (tất nhiên là hai lần).
Để xác minh mật khẩu mới của người dùng, bạn xác minh tên người dùng, địa chỉ email và mã id đều khớp, yêu cầu chưa hết hạn và hai mật khẩu mới khớp nhau. Nếu thành công, bạn thay đổi mật khẩu của người dùng thành mật khẩu mới và xóa các trường đặt lại mật khẩu khỏi bảng người dùng. Ngoài ra, hãy đảm bảo đăng xuất người dùng / xóa mọi cookie liên quan đến đăng nhập và chuyển hướng người dùng đến trang đăng nhập.
Về cơ bản, trường new_passwd_id là mật khẩu chỉ hoạt động trên trang đặt lại mật khẩu.
Một cải tiến tiềm năng: bạn có thể xóa <tên người dùng> khỏi email. "Ai đó đã yêu cầu đặt lại mật khẩu cho tài khoản tại địa chỉ email này ...." Do đó, chỉ người dùng mới biết nếu email bị chặn. Tôi không bắt đầu theo cách đó vì nếu ai đó đang tấn công tài khoản, họ đã biết tên người dùng. Điều tối kỵ bổ sung này ngăn chặn các cuộc tấn công trung gian của cơ hội trong trường hợp ai đó có ý định xấu chặn email.
Đối với câu hỏi của bạn:
tạo chuỗi ngẫu nhiên: Nó không cần phải cực kỳ ngẫu nhiên. Bất kỳ trình tạo GUID nào hoặc thậm chí md5 (concat (salt, current_timestamp ())) là đủ, trong đó muối là thứ trên bản ghi người dùng như tài khoản dấu thời gian đã được tạo. Nó phải là thứ mà người dùng không thể nhìn thấy.
bộ đếm thời gian: Có, bạn cần cái này chỉ để giữ cho cơ sở dữ liệu của bạn khỏe mạnh. Không quá một tuần là thực sự cần thiết nhưng ít nhất là 2 ngày vì bạn không bao giờ biết thời gian trễ email có thể kéo dài bao lâu.
Địa chỉ IP: Vì email có thể bị trì hoãn hàng ngày, địa chỉ IP chỉ hữu ích cho việc ghi nhật ký chứ không phải để xác thực. Nếu bạn muốn đăng nhập nó, hãy làm như vậy, nếu không bạn không cần nó.
Đặt lại màn hình: Xem ở trên.
Hy vọng rằng bao gồm nó. Chúc may mắn.