Best practice for resetting forgotten user passwords
据我所知,有两种合理的方法可以重置用户忘记的密码。
让用户输入他们的电子邮件地址,并向他们的电子邮件地址发送一个新的明文密码。
一个链接被发送到他们的电子邮件地址,该地址在URL中有一个uid号。点击这个按钮,用户将进入网站上的一个表单,在那里他们可以选择自己的新密码。
哪种方法更可取?为什么?
如果使用方法1,可能第三方可以阅读电子邮件并获得新密码。如果使用方法2,如何阻止某人有条不紊地通过uid代码尝试访问表单以更改用户密码?
最好的模式是:
用户请求密码重置。最好是通过用户名来完成,并且不指示用户名是否存在(以避免通过脚本列出的用户)
在具有userid和datetime的新数据库表中生成记录请求(=current datetime),以及刚刚生成的guid
向用户发送一封邮件,指向"密码重置"页作为参数的guid(不是userid)
在这个页面上,您应该检查guid是否存在,以及最终你可以设定一个有效期(=用户有一天例如重置)
不要忘记将记录标记为"已用"(在当用户重置密码时,您可以停止最后的第二次尝试…
它可能更安全,但我想这已经相当好了……
OWASP有一个很好的https://www.owasp.org/index.php/forgot_password_作弊表检查表
以下是步骤的快速摘要:
通过询问验证问题来验证发送者是否是真正的用户。
不要在计划员工列表之外的个人电子邮件上发送密码。
不要在电子邮件的标题或正文中添加"密码"一词。
请确保分别发送用户名和密码。
对于Office 365用户,请将其定向到"忘记我的密码"区域或发送此链接https://passwordreset.microsoftonline.com
不要被用户吓倒,如果需要,请上报给IT经理。