时间限制,或一次性使用,密码重置令牌?

Cha*_*eus 12 security passwords password-recovery

用户忘记了密码,并且(几乎)所有会员网站都需要一种方法来帮助用户重新访问.

我想实现常见的场景:

  1. 用户点击网站,尝试登录,不能,并意识到他们忘记了密码 - 废话!
  2. 用户输入电子邮件地址并点击"忘记密码"
  3. 用户使用密码重置链接获取电子邮件

以下是我计划实现的方法(C#/ ASP.NET MVC):

  1. 当用户输入电子邮件并点击"忘记密码"按钮时,我的网站将生成GUID,将其存储在DB(member.ResetToken)中的成员实体上,并通过电子邮件向他们发送带有该GUID的链接(发送的电子邮件将通知他们只能使用此链接一次)
  2. 用户点击该链接,我的网站会根据网址中的内容查找其帐户member.ResetToken.如果找到他们的帐户,请向他们显示密码重置表单,并在他们完成重置后清除member.ResetToken其帐户.

这是我的问题:保持这样(他们可以随时,现在或将来使用该链接重置密码)或添加时间戳以限制他们重置密码的时间长度?

从用户体验的角度来看,只要你准备好就重置密码的能力很好,但我想确保我不会忽视这可能带来的一些安全问题.

mar*_*kli 9

你的方案确实有效,但有些方面可以改进.但首先是关于时间限制的原始问题:

让我们问相反的问题:为什么令牌仍然无效?

没有任何优势,当两年后点击重置链接时,用户可以在大约一小时内点击链接,或者他可能忘记了链接(并且可以在必要时请求新的链接).另一方面,能够阅读电子邮件并不一定意味着攻击者必须破解电子邮件帐户,例如办公室中的开放电子邮件客户端,丢失的移动电话, (丢失)USB驱动器上的备份......

最重要的改进是,您应该只在数据库中存储令牌的哈希值.有权访问数据库(SQL注入)的人可能会要求为他喜欢的任何电子邮件地址重置密码,并且因为他可以看到新令牌,他可以使用它来设置自己的密码.

然后我会将这些重置信息存储在一个单独的表中.在那里,您可以存储用户标识,散列标记,到期日期以及链接是否已被使用的信息.那时用户不处于特殊状态.

也许我误解了这一点,但重置链接应指向密码重置的特殊页面.当用户进入登录页面时,应该没有特殊处理,登录页面不应该知道有未决的密码重置.

重置令牌应该是不可预测的,这可以通过真正随机的代码实现,从操作系统的随机源读取.


Ale*_*off 1

用户还忘记重置密码(事情时有发生)。由于对密码很偏执,我建议将链接生命周期限制为 24 小时。这应该足够了。它不能解决恶意拦截的问题,但总比没有好。