密码恢复流程 - 将密码恢复发送到任何电子邮件?

Posted

技术标签:

【中文标题】密码恢复流程 - 将密码恢复发送到任何电子邮件?【英文标题】:Password recovery flow - Send Password recovery to any email? 【发布时间】:2014-12-11 04:10:59 【问题描述】:

我正在构建一个新的 MVC 应用程序。 考虑到这个“忘记密码”流程:

1)您输入了一封电子邮件。 2)您按“发送恢复密码”。 3) 一封电子邮件在收件箱中等待,按下其中的链接会将您带到“新密码”屏幕。

在第 1 阶段,您提供的电子邮件没有任何限制。 (它甚至可能不存在)。

此流程是否存在重大安全漏洞?

【问题讨论】:

如果该电子邮件地址不存在用户帐户会怎样? 正如我所说,没有限制。可以是任何电子邮件 这就是有人登录的原因吗?否则,您将哪个帐户的密码发送到提供的电子邮件地址。如果他们已登录,为什么他们需要“恢复”密码,将密码发送到帐户电子邮件以外的任何帐户都是 IMO 的巨大安全风险。如果攻击者发现漏洞,他们可以将每个人的密码发送到他们自己的电子邮件地址,如果您只发送到帐户地址,攻击者也必须有权访问该电子邮件帐户。 @sa_ddam213 - 这听起来像是一个自定义链接,当且仅当您输入正确的电子邮件地址时您才会获得。希望如果实施正确,电子邮件输入表单不会告诉您是否输入了错误的电子邮件。 @Tommy, there is no limitations on the email you provide. (It may not even exist). 我读到当我输入任意电子邮件地址并将密码发送到该电子邮件时,我仍然很好奇这封电子邮件是如何链接到拥有密码,问题中没有太多细节,所以我假设了我的大部分评论:),所以我猜用户已经登录,这是我主要关心的问题,但是如果他们登录了为什么要重置,为什么不使用asp更改密码功能,但我相信他有他的理由 【参考方案1】:

在与问题下的某人讨论时,我想我会继续发布我们如何使用类似的流程处理密码重置,并指出我们在哪里尝试防止恶意意图。这是我们的流程:

    在登录表单上,有一个“忘记密码”的链接

    简单文本框中的忘记密码屏幕,您可以在其中输入您的电子邮件地址。在我们的实现中,电子邮件地址就是用户名,但只要每个用户的帐户都附有一个有效的电子邮件地址,这并不重要。

    用户输入电子邮件地址并按“提交”。

    如果电子邮件地址与有效帐户相关联,我们生成一个 GUID,将其存储在与请求用户帐户关联的密码重置请求表中并设置过期时间30 分钟。

    如果电子邮件地址不存在,我们什么也不做。不会向任何人发送电子邮件。

    无论电子邮件地址是否正确,我们都会显示“谢谢,如果您输入的电子邮件地址正确,您将很快收到一封电子邮件,其中包含有关如何重置密码的说明”。这一点很重要,因为您不希望不良用户使用此表单来尝试发现用户名。

    用户收到电子邮件并单击链接。如果 GUID/链接仍然有效,这会将他们带到重置密码屏幕(带有新密码/确认新密码文本框)。如果不是,我们会在密钥过期或不存在时显示“此重置密钥不再有效”。

    重置后,用户被重定向到登录屏幕以登录应用程序。

希望这会有所帮助。正如其他人所说,使用一种好的方法来生成重置密码链接,不要在链接中使用任何用户识别信息(有人可能会猜到它,找出你的算法等)。

【讨论】:

【参考方案2】:

In my implementation,当用户在忘记密码屏幕中输入电子邮件(这也是帐户的密钥/ID)时,他会收到一条消息“电子邮件已发送到您输入的电子邮件:”。当然,可能会发生帐户被锁定或不存在的情况。因此,您可以发出另一条消息:“帐户已锁定或不存在”。但这有点冒险,因为黑客可以“收获”帐户。

【讨论】:

【参考方案3】:

您应该在“新密码”部分使用 https,以避免有人试图拦截该新密码。

确保您生成的链接不会以任何方式对电子邮件进行编码。否则,如果黑客发现了该方案,那么他们可以轻松地使用它来生成链接并为其他用户重置密码。我看到有些人在查询字符串中传递电子邮件或用户名,这很糟糕。确保您在 POST 请求上完成其余的工作。

确保链接在某个时间窗口内过期也很好。此外,请确保对您的系统接受的密码类型(最少字符数、字母数字、特殊字符等)有良好的安全限制。

确保您记录了发起重置请求的 IP 地址以及重置密码的 IP 地址。

最后,确保新密码表单中没有任何 XSS(跨站点脚本)错误,您还可以通过在表单中​​添加防伪令牌来增加更多保护,以防止 XSRF(跨站点请求伪造) .有 ASP.NET MVC 的 AntiForgeryToken() 辅助方法。

电子邮件的无限制有点奇怪——它可以用来为其他人生成垃圾邮件。你说它会在下一阶段得到解决,所以如果你的应用程序是低调的,并且在更可靠的环境中使用,比如小型 Intranet 或小型企业社区,它可能是可以的。

即使这样,如果用户在他们的电子邮件中有拼写错误并等待密码重置电子邮件到达,而系统正在向其他人发送密码重置电子邮件,这可能会成为一个大问题。现在,如果这个“其他人”为您的用户重置密码,您就有麻烦了。因此,您可能还想重新确认该页面上的电子邮件,但如果收到电子邮件的用户的意图是恶意的,那也可以被猜到。鉴于此,最好添加检查以查看用户是否存在于第一阶段本身 - 以确保完全安全。

【讨论】:

以上是关于密码恢复流程 - 将密码恢复发送到任何电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

使用用户 ID 代替电子邮件发送密码恢复令牌是不是安全?

好的密码恢复方法

使用发送到电子邮件的动态 URL 实现 Spring Security 密码恢复的指南

密码恢复不发送电子邮件。

密码恢复链接上不会加载任何内容

使用 Meteor 和 Mailgun 恢复密码