正确设计这个功能,保证安全可靠,并不简单。下面就是安全专家 Troy Hunt 给出的设计指南。
第一条规则:密码永远都要哈希保存。
第二条规则:找回密码就是让用户重置密码。
第三条规则:重置密码的时候,要给出一个链接,让用户到网页上自己修改密码。
重置链接由于是明文传播,而且直接修改密码,所以必须有失效时间。一般来说,可以设成10分钟失效。
第四条规则:重置密码之前,如果用户提供了错误的邮件地址,不要提示他。
正确的做法是,不管用户输入什么邮箱,都向该邮箱发邮件。在邮件里说明,有人尝试重置密码,但是他输入的邮箱不在数据库里面。
第五条规则:重置密码的时候,识别用户最好依靠邮件地址,而不是用户名。
为了防止机器人攻击,进入重置密码之前,最好加上 CAPTCHA 识别。
CAPTCHA项目是Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自动区分计算机和人类的图灵测试)的简称
第六条规则:如果条件允许,重置密码之前,最好请用户回答一些个人问题,或者采用 2FA 验证,比如短信验证码。
最后,不要忘了记录 IP 地址,在邮件里面告诉用户,哪个 IP 地址在申请重置你的密码。
参考链接:http://www.ruanyifeng.com/blog/2019/02/password.html