据我所知,有两种合理的方法可以重置用户忘记的密码。
让用户输入他们的电子邮件地址,并将新的明文密码发送到他们的电子邮件地址。
一个链接会发送到他们的电子邮件地址,该地址在 URL 中有一个 UID 号。单击此按钮会将用户带到网站上的表单,他们可以在其中选择自己的新密码。
哪种方法更可取,为什么?
如果使用方法一,也许第三方可以阅读电子邮件并获得新密码。如果使用方法 2,如何阻止有人有条不紊地通过 UID 代码尝试访问表单以更改用户密码?
据我所知,有两种合理的方法可以重置用户忘记的密码。
让用户输入他们的电子邮件地址,并将新的明文密码发送到他们的电子邮件地址。
一个链接会发送到他们的电子邮件地址,该地址在 URL 中有一个 UID 号。单击此按钮会将用户带到网站上的表单,他们可以在其中选择自己的新密码。
哪种方法更可取,为什么?
如果使用方法一,也许第三方可以阅读电子邮件并获得新密码。如果使用方法 2,如何阻止有人有条不紊地通过 UID 代码尝试访问表单以更改用户密码?
最好的模式是:
用户请求密码重置。最好是通过用户名来做,不要指出用户名是否存在(以避免可能的用户通过脚本列出)
您在新的数据库表中生成一条记录,其中包含用户 ID、请求的日期时间(= 当前日期时间)和刚生成的 GUID
您向用户发送一封邮件,指向以 GUID(而不是用户 ID)作为参数的密码重置页面
在此页面上,您应该检查 GUID 是否存在,最终您可以设置一些到期日期(例如,用户有 1 天的时间重置)
当用户重置密码时,不要忘记将记录标记为“已使用”(表中有一个额外的字段),以便您可以停止最终的第二次尝试......
它可能更安全,但我认为这已经很好了......
OWASP 有一个很好的清单https://www.owasp.org/index.php/Forgot_Password_Cheat_Sheet
以下是步骤的快速摘要:
通过询问验证问题来验证发件人是否是真实用户。
不要在不在平面员工列表中的个人电子邮件上发送密码。
不要在电子邮件的标题或正文中添加“密码”一词。
确保分别发送用户名和密码。
对于 Office 365 用户,将他们引导至忘记密码区域或发送此链接https://passwordreset.microsoftonline.com
不要被用户吓倒,如果需要,请上报给 IT 经理。