关于安全性:发送“重置密码”链接的安全方式

Secure way to send “reset password” link

我正在使用django开发一个Web应用程序。

目前我正致力于发送"重置密码链接"彻底的电子邮件(亚马逊简单电子邮件服务-SES)

我使用的机制与下面链接的"SimeonWillbanks"的答案相同。

重置密码或提供旧密码的安全方法

  • 为用户提供重置密码选项。
  • 此选项为用户保存唯一的令牌。令牌最终到期(小时、天或天)。
  • 链接通过电子邮件发送给用户,其中包括令牌。
  • 用户单击电子邮件链接。
  • 如果令牌存在且未过期,则链接将加载新的密码表单。如果没有,不要加载新的密码表单。
  • 一旦用户设置了新密码,删除令牌并向用户发送确认电子邮件。
  • 我担心的是,我不确定这种方式在安全方面是否安全。如果电子邮件被黑客捕获怎么办?

    我在几个主要网站上测试了他们是如何关心这个问题的。

  • 获取"重置密码"电子邮件并复制链接。
  • 把链接给其他人,看看他是否可以更改我的密码。
  • 通过这个测试,我发现其他人也只能通过链接更改我的密码。

    如果我不能在链接上做任何事情,有没有办法使电子邮件更安全?就像网站上的ssl(https)机制一样?

    谢谢!


    它有点安全,但是如果用户的电子邮件被破坏,它就是Toast。

    我更喜欢在URL中使用HMAC,这样可以避免在数据库中存储令牌。

    如果在URL和HMAC中包含用户的IP地址,则可以确保重置链接单击来自请求重置的同一台计算机(实际上是路由器),并且不能共享。

    您可以使用用户名/电子邮件和HMAC设置设备cookie,而不是IP,然后在电子邮件中出现重置链接时检查此项。

    在用户点击链接后,系统应该向他询问一个秘密问题的答案。更棒的是,用一个短的随机码向他的手机发送一条短信,然后要求得到。这称为https://en.wikipedia.org/wiki/multi-factor_身份验证

    然后显示更改密码表单(当然是通过https)。

    当我们在这里时,无论用户是否有帐户,您都应该显示相同的"成功"消息,以避免用户枚举攻击。

    此外,还可以使用本地主机MTA中继或异步电子邮件,这样黑客就无法判断您是否发送了电子邮件(响应缓慢会指示用户存在)。