【问题标题】:Best way of doing code for "Forgotten Password"为“忘记密码”编写代码的最佳方法
【发布时间】:2010-12-31 17:33:40
【问题描述】:

net 网站,我想实现忘记密码。我正在使用以下步骤

  1. 具有登录 ID 和电子邮件 ID 和验证码输入框的表单
  2. 当用户输入详细信息并提交时,在后端验证后生成新密码并替换数据库中的旧密码。
  3. 新密码已通过电子邮件发送给用户。

请帮我看看我做得对不对?

还有其他安全机制吗?

[编辑] 谢谢,我收到了你的回复。这确实是一种安全机制。但在这里我几乎没有疑问

  1. 当用户在忘记密码页面输入 loginId 和电子邮件地址时,我应该向用户显示什么信息?
  2. 有效用户和恶意用户的消息是否相同?
  3. 使用 CSRF 令牌的优势?任何帮助/链接
  4. 当用户点击链接时,我应该怎么做;因为我猜用户应该自动登录到他们的帐户 - 然后我有两个选择(第一个)自动向用户发送新密码(第二个)新表单将显示给用户,用户将输入旧密码和新密码两次?李>

请帮忙?

【问题讨论】:

    标签: asp.net security passwords


    【解决方案1】:

    您应该检查问题的答案:Can anyone provide references for implementing web application self password reset mechanisms properly? from D.W. on security.stackexchange。

    这是我在该主题上找到的最完整的答案。我也建议你阅读这篇文章:Everything you ever wanted to know about building a secure password reset feature

    【讨论】:

      【解决方案2】:

      我明白你为什么想要验证码,但我会采取不同的方法。

      1. 当请求重置密码时,请检查是否在过去 X 分钟内尚未为该帐户请求重置。如果已请求密码,请忽略重置请求。
      2. 检查请求密码重置的 IP。如果该 IP 在过去 Y 分钟内请求重置密码,请忽略该请求。
      3. 如果检查 1 和 2 通过检查帐户是否存在。如果它不忽略请求。
      4. 如果我们已经做到了这一点,请生成一个一次性令牌,该令牌将在 Z 分钟后到期,并生成一个包含此令牌的密码重置 URL。将此电子邮件发送到注册的电子邮件地址。加载 URL 时提示输入新密码并重置。

      对于那些认为您应该告诉用户电子邮件去了哪里的人,我强烈反对。这就是“信息泄露”,即使您确实将其限制在域名范围内。例如,假设我在 JeffAtwoodEatsBabies.com 上注册为吹镖。如果 Jeff 为我请求了密码重置并且您显示了注册域,那么他会看到 idunno.org。这是我的个人领域,因此 Jeff 会知道吹镖用户实际上就是我。这是一个坏坏的事情。我不应该使用 hotmail 或 gmail 或其他任何方式进行注册,以保护自己免受您向所有人显示电子邮件域的代码的影响。

      此外,您根本不应该显示错误消息。无论发生什么情况,用户名并未实际注册,或者请求过多或天塌下来,您都应该告诉用户密码重置程序已经开始。通知用户帐户不存在是更多的信息泄漏。

      您可以做的最后一件事是向重置请求页面添加一个 CSRF 令牌,这样它就不能从其他网站驱动。

      跟进

      所以回答您的其他问题。

      1. 显示什么消息由您决定。 “重置密码的说明已通过电子邮件发送到此帐户的注册邮箱”是一种想法,但实际上这取决于您的受众。
      2. 上面已经解决了。
      3. 维基百科是一个很好的starting point。你怎么做取决于你的平台,完全是另一个问题!对于 ASP.NET,您可以查看我的 codeplex 项目 http://anticsrf.codeplex.com 或查看 ViewStateUserKey
      4. 单击链接时,我首先会根据应用它的用户名验证 URL 中的令牌,然后我将允许用户输入新密码,或者生成一个新密码并通过电子邮件发送。你不能提示旧的,因为关键是用户已经忘记了!

      【讨论】:

      • 如果真正的用户输入了他们的信息但不小心拼错了怎么办?现在您已经告诉他们他们的流程已经开始,他们可能没有注意到他们的错误并继续他们的业务,但永远不会收到电子邮件并想知道您的网站为什么会损坏。
      • 好吧,您必须在安全性与手脚笨拙的用户之间取得平衡。这只是站点管理员可以做出的选择,但通常我建议我的客户站在安全的一边。信息泄露在 OWASP 前 10 名中 - 不能掉以轻心。
      • 谢谢,您清除了我的许多疑问。有没有链接可以看到你写的步骤演示?
      • 另外,你能告诉我验证令牌ID的过程
      • 不 - 每个站点总是独一无二的,我没有一个可以分享。
      【解决方案3】:

      这有很多实现方式。正如您所说,生成新密码并将其发送到注册的电子邮件地址是一种方法。不过我不建议你走那条路,因为每次有人试图猜测我的密码时,我的密码都会被重置。

      相反,我迄今为止看到的最好的事情就是简单地通过电子邮件发送带有链接的注册电子邮件,该链接将开始密码重置过程。您甚至可以通过显示他们在注册时使用的电子邮件地址的掩码版本来让用户知道要检查哪个电子邮件地址:

      一封电子邮件已发送至********@hotmail.com。请检查您的收件箱以继续。

      请务必考虑我们这些可能忘记注册电子邮件地址的人 - 通常几个安全问题是使该信息可用的好方法。

      【讨论】:

      • +1 考虑在 foo@bar.com 注册的用户 说“我们通过电子邮件向您发送了您使用的电子邮件地址的链接...以 foo@ 开头”的任何安全问题... cmets on这个策略?
      • @pcampbell - +1 我真的很喜欢这个主意,因为我有时想知道我注册的电子邮件是什么,但我认为更好的方法是提供域名而不是电子邮件地址(@ hotmail.com、@yahoo.com、@gmail.com),因为我认为大多数人可能拥有相同的电子邮件地址,只是在不同的提供商处。
      • 我喜欢看到我的电子邮件地址的屏蔽版本(如果有的话)。我已经更新了我的帖子以反映这一点。
      • 你的意思是首先我需要验证用户电子邮件,然后如果验证通过,然后将密码发送到电子邮件。
      • 赫曼特,没有。我会将电子邮件发送到该特定用户名的任何电子邮件地址。
      【解决方案4】:

      我最近做过。当用户输入他们的用户名或电子邮件地址时,我们会生成一个唯一的令牌并将其作为链接的一部分通过电子邮件发送给他们。收到该电子邮件后,他们单击链接并自动登录,进入我的帐户屏幕,并提示重置密码。

      当然,这 100% 依赖于电子邮件客户端的安全性,但从可用性的角度来看,它很难被击败。

      【讨论】:

      • 这是一个很好的解决方案,只是不要忘记只存储密码的哈希值而不是纯文本密码。您也应该删除验证码,因为它不是真正必要的,因为您必须检查电子邮件和用户名之间的匹配。
      • 我有几个问题? 1.生成唯一令牌有什么好处。 2.如果我将用户重定向到用户必须输入新密码的帐户页面,在这种情况下,如果我自动生成密码并发送电子邮件给用户会发生什么?是什么原因导致我们需要生成唯一令牌并向用户显示帐户表单以更改密码?
      • 自动生成密码和让(经过身份验证的)用户输入密码的区别在于他们会记住他们输入的密码。此外,它不会将密码保存在电子邮件中,以防以后有人访问已保存的电子邮件,它不会帮助他们破解它。
      • 好吧,告诉我一件事,如果用户点击唯一令牌的链接,那么让用户自动登录好不好;无需询问登录凭据
      • @Hemant:是的,只要您有令牌,您就可以自动登录。您会看到,令牌是通过“忘记我的密码”链接获得的身份验证(延迟)。它声称他们可以访问他们的电子邮件帐户。
      猜你喜欢
      • 2010-10-06
      • 1970-01-01
      • 2012-11-30
      • 2015-10-20
      • 2013-12-22
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 2012-02-28
      相关资源
      最近更新 更多