Forgotten password reset page: should the user need to enter a username/email as well?
我正在为下一个版本的用户管理系统重新实现"重置密码"功能。它目前的工作方式是:
用户输入用户名和电子邮件地址。
如果此信息正确,将生成一个随机令牌并存储在数据库中,并将一个包含该令牌的链接发送到用户的电子邮件地址的文件中。
用户单击链接,选择"确认"或"拒绝"重置请求。
如果他们确认重置请求,他们必须输入他们的电子邮件地址和新密码(并重复新密码)。这与令牌一起发布到服务器。如果电子邮件地址与令牌匹配,并且重置请求尚未过期,则会更新密码。
我的问题是:我们真的需要用户在创建新密码时重新输入他们的电子邮件地址吗?如果随机令牌足够强,那么需要额外的信息是否提供了任何额外的安全性,或者只是恶化了UX?
- 你不能在发送给用户的链接中对电子邮件地址进行编码吗?这样用户就不必输入新密码以外的任何内容。
- 事实上,我可以-问题是,我应该吗?
- 要求电子邮件似乎可以解决攻击者知道(或可以猜测)令牌但不知道电子邮件地址的用例。如果攻击者从用户的电子邮件中获取令牌,那么攻击者肯定知道电子邮件地址。在发送给用户的URL中对电子邮件地址进行编码,似乎并没有给攻击者提供任何他们还没有的信息。您可能希望由security.se运行此命令。
- 如果令牌是唯一的,我根本不需要对电子邮件地址进行编码。我只能通过他们的令牌来识别用户。
- 这是真的,但从技术上讲,如果攻击者知道任何令牌,即使他们不知道电子邮件地址,也可以更改密码。实际上,我认为这不算什么问题。我的总体观点是,通过让用户手动输入他们的电子邮件地址,您可以保持相同的安全层(尽管是一个薄弱层),而不会给用户带来麻烦。
- 另请参阅此问题stackoverflow.com/q/6631756/311525
我看不出这样做有什么价值。把钥匙锁好。可能是128位(即22位64位编码字符)安全随机的。看起来足够大了。还可以向令牌生命周期添加超时。24小时似乎是安全和不便之间的折衷办法。
我喜欢将电子邮件地址添加到令牌中,这样您就可以更智能地记录故障。