首先,我们需要知道您对用户的了解。显然,您有一个用户名和一个旧密码。你还知道什么 您有电子邮件地址吗?您是否有关于用户喜欢的花朵的数据?
假设您具有用户名,密码和有效的电子邮件地址,则需要在用户表中添加两个字段(假设它是数据库表):一个名为new_passwd_expire的日期和一个字符串new_passwd_id。
假设您具有用户的电子邮件地址,那么当有人请求重设密码时,您可以如下更新用户表:
new_passwd_expire = now() + some number of days
new_passwd_id = some random string of characters (see below)
接下来,您向该地址的用户发送电子邮件:
亲爱的某某
有人在<您的网站名称>上请求了用户帐户<username>的新密码。如果您确实要求重设密码,请点击以下链接:
http://example.com/yourscript.lang?update= < new_password_id >
如果该链接不起作用,则可以转到http://example.com/yourscript.lang,然后在表单中输入以下内容:<new_password_id>
如果您不要求重设密码,则可以忽略此电子邮件。
谢谢,yada yada
现在,编码yourscript.lang:此脚本需要一个表单。如果在URL上传递了var更新,则表单仅询问用户的用户名和电子邮件地址。如果未通过更新,它将询问用户名,电子邮件地址和电子邮件中发送的ID码。您还要求输入新密码(当然是两次)。
要验证用户的新密码,请验证用户名,电子邮件地址和ID码是否都匹配,请求未过期以及两个新密码都匹配。如果成功,则将用户密码更改为新密码,并清除用户表中的密码重置字段。另外,请确保注销用户/清除所有与登录相关的cookie,然后将用户重定向到登录页面。
本质上,new_passwd_id字段是仅在密码重置页面上有效的密码。
一项潜在的改进:您可以从电子邮件中删除<用户名>。“有人请求为此电子邮件地址的帐户重设密码...。”因此,如果用户名被截获,则只有用户知道用户名。我并不是从那开始的,因为如果有人攻击了该帐户,他们已经知道用户名。这种增加的模糊性阻止了恶意的中间人攻击机会,以防有人恶意拦截电子邮件。
至于您的问题:
生成随机字符串:不需要非常随机。任何GUID生成器,甚至md5(concat(salt,current_timestamp()))都足够,其中盐是用户记录上的东西,例如创建了时间戳帐户。它必须是用户看不到的东西。
计时器:是的,您只需要保持数据库正常即可。真正需要的时间不超过一周,但至少需要两天,因为您不知道电子邮件延迟可能持续多长时间。
IP地址:由于电子邮件可能会延迟几天,因此IP地址仅用于日志记录,而不用于验证。如果要记录,请这样做,否则不需要它。
重置屏幕:请参见上文。
希望能掩盖它。祝好运。