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