2

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

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

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

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

  1. 为用户提供重置密码选项。
  2. 此选项为用户保存唯一令牌。令牌最终会过期(几小时、几天或几天)。
  3. 包含令牌的链接通过电子邮件发送给用户。
  4. 用户点击电子邮件链接。
  5. 如果令牌存在且未过期,则链接会加载新的密码表单。如果不是,请不要加载新密码表单。
  6. 用户设置新密码后,删除令牌并向用户发送确认电子邮件。

我担心的是,我不确定这种方式在安全性方面是否安全。如果电子邮件被黑客捕获怎么办?

我在几个主要网站上测试了他们对此的关心程度。

  1. 收到“重置密码”电子邮件并复制链接。
  2. 将链接提供给其他人,看看他是否可以更改我帐户的密码。

从这个测试中,我发现其他人也只能通过链接更改我的密码。

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

谢谢!

4

1 回答 1

2

它有点安全,但如果用户的电子邮件被泄露,那就太麻烦了。

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

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

代替 IP,您可以使用用户名/电子邮件和 HMAC 设置设备 cookie,然后在重置链接来自电子邮件时检查此设置。

系统应在用户单击链接后询问用户秘密问题的答案。更好的是,向他的手机发送一条带有简短随机代码的短信并询问。这称为https://en.wikipedia.org/wiki/Multi-factor_authentication

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

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

此外,使用 localhost MTA 中继或异步电子邮件,这样黑客就无法判断您是否发送了电子邮件(响应缓慢表明用户存在​​)。

于 2015-08-20T02:55:34.380 回答