安全的方式发送“重置密码”链接

时间:2015-08-20 01:25:43

标签: security email reset-password

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

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

我使用的机制与链接下面的“simeonwillbanks”的答案相同

Secure ways to reset password or to give old password

  1. 为用户提供重置密码选项。
  2. 此选项为用户保存唯一标记。令牌最终到期(小时,天或天)。
  3. 通过电子邮件向用户发送包含令牌的链接。
  4. 用户点击通过电子邮件发送的链接。
  5. 如果令牌存在且未过期,则链接会加载新密码表单。如果没有,请不要加载新密码表单。
  6. 用户设置新密码后,删除令牌并向用户发送确认电子邮件。
  7. 我担心这一点,我不确定这种方式在安全性方面是否安全。如果电子邮件被黑客捕获怎么办?

    我在几个主要网站上测试了他们如何关心这一点。

    1. 获取“重置密码”电子邮件并复制该链接。
    2. 将链接提供给其他人,看看他是否可以更改我帐户的密码。
    3. 通过此测试,我发现其他人也只能通过链接更改我的密码。

      如果我无法在链接上执行任何操作,是否可以使电子邮件更安全? 就像网站上的ssl(https)机制一样?

      谢谢!

1 个答案:

答案 0 :(得分:2)

虽然用户的电子邮件遭到入侵,但它有点安全。

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

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

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

系统应在用户点击链接后询问用户对机密问题的答案。更好的是,使用短随机码向他的手机发送短信并提出要求。这称为https://en.wikipedia.org/wiki/Multi-factor_authentication

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

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

此外,使用localhost MTA中继或异步电子邮件,以便黑客无法判断您是否发送了电子邮件(响应速度缓慢表示用户存在)。