【问题标题】:Secure way to send "reset password" link发送“重置密码”链接的安全方式
【发布时间】:2015-11-13 11:57:10
【问题描述】:

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

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

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

Secure ways to reset password or to give old password

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

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

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

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

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

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

谢谢!

【问题讨论】:

  • 您唯一能做的就是使用 SMTP/S 而不是普通 SMTP 发送电子邮件,并尽可能缩短令牌的有效期(几分钟而不是几小时或几天),但您'是的,这种常用的重置密码流程本质上是不安全的。
  • 您可以首先在输入令牌时询问一些额外的安全细节,或者使用短信/手机号码等第二个因素。您也可以不要求提供电子邮件,而是要求登录,该登录永远不会向网站上的任何人显示(即,如果您想攻击某人,则无法仅使用电子邮件地址重置他的帐户)。所有这些都增加了一个小的附加层,但也增加了支持请求(忘记用户名等)。
  • 谢谢大家的回答! @Robby Cornelissen,你能解释一下关于 SMTP/S 的更多信息吗?我试图研究它,没有足够的参考。
  • 我也在为 ses 使用 boto(AWS 的 Python 库),根据他们的文档,Amazon SES 通过受 TLS 保护的连接(仅限 TLS 1.0 版)发送消息默认。这种方法称为机会 TLS,意味着当 Amazon SES 与接收邮件服务器建立 SMTP 连接时,如果接收邮件服务器支持 TLS,Amazon SES 会使用 STARTTLS 协议升级连接。如果接收服务器不通告 STARTTLS 或 TLS 协商失败,则连接以明文方式进行 TLS 不够安全?

标签: security email reset-password


【解决方案1】:

它有点安全,但如果用户的电子邮件被泄露,它会很安全。

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的帮助!我会考虑你提到的每一个因素!
猜你喜欢
  • 2013-12-15
  • 2011-11-07
  • 2020-02-07
  • 2019-02-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多