究竟什么时候应该删除旧的密码重置令牌?

信息安全 密码 防御
2021-08-13 13:12:17

我正在尝试找出使用密码重置令牌的最佳实践。

假设用户启动密码重置过程并通过电子邮件发送重置令牌,我们将哈希副本存储在数据库中。令牌在我们的数据库中带有时间戳,并且会在例如 24 小时后被视为过期。

现在考虑接下来可能发生的两种情况:

1) 用户认为他没有收到邮件,再次尝试重置。我们应该允许他生成另一个令牌吗?如果这样做,我们是否应该立即删除旧令牌?(无论如何,它们都将在问题发生后 24 小时后失效datetime......)我认为,如果我们允许一点灵活性,只要它们无论如何都会过期,它将最大限度地减少支持电话。有没有我在这里没有考虑的攻击类型?

2) 用户收到邮件并点击重置链接,但未填写重置表单。我应该什么时候删除重置令牌?只有在成功重置后——用户可以在24小时内反复点击链接,只有在最终重置密码后才会失效。还是出于安全考虑,我应该在他单击链接后立即删除令牌?(所有这些都发生在到期之前)

2个回答

当用户单击它时,您不应该重置令牌,因为用户可能会在此过程中受到干扰(例如,他的猫跳到键盘上——我的猫经常这样做)。

(两天前我在使用这样一个链接——不是用于密码重置,而是类似的——当我点击它时它就被停用了,结果它后面的页面与 Chrome 不兼容。所以我有请求一个新的链接,整个过程再做一次,我为此诅咒他们。在处理密码时,你想要并且需要与用户建立合作伙伴关系,当然不要让他生气。)

实际重置密码时,应停用所有未决的密码重置链接。如果一次只允许一个重置链接会更简单;如果用户在前一个链接仍然有效时请求重置密码,只需再次发送(可能重置超时计数器)。无需支持多个同时有效、不同的密码重置链接。一次一个链接意味着更容易的数据库设计,因此错误的范围更小。

  • 我建议只允许用户请求一次密码重置,以便您一次只有一个重置令牌。
  • 您始终可以跟踪邮件是否发送成功,然后才将重置令牌存储在数据库中。
  • 如果用户尝试再次执行此操作(并且存在活动的重置链接),请通知用户说“重置链接已发送”。
  • 关于密码令牌的删除:密码令牌应在成功重置密码后立即删除,而不是在单击其余链接后立即删除。
  • 一种可能的替代方法是重置用户的密码并在数据库中更新它。向用户发送邮件通知“这是您的新密码,请立即更改”
  • 请注意,如果电子邮件通信未加密,密码重置过程将始终容易受到攻击。通过限制重置 URL 的时间,可以尝试最小化潜在攻击的攻击窗口。