为“忘记密码”做代码的最佳方式

时间:2010-01-02 05:11:58

标签: asp.net security passwords

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

  1. 表格上有登录ID和电子邮件ID和CAPTCHA的输入框
  2. 当用户输入详细信息并提交时,在验证后的后端生成新密码并在数据库中替换旧密码。
  3. 新的passowrd通过电子邮件发送给用户。
  4. 请帮助我,不管我做得对吗?

    是否还有其他安全机制?

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

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

4 个答案:

答案 0 :(得分:12)

我明白为什么你想要一个CAPTCHA,但我会采取不同的方法。

  1. 请求重置密码时,请检查在最后 X 分钟内是否尚未为该帐户请求重置。如果已经请求了密码,则忽略重置请求。
  2. 检查请求密码重置的IP。如果该IP请求在最后 Y 分钟内重置密码,请忽略该请求。
  3. 如果检查1& 2通过检查帐户是否存在。如果它没有忽略该请求。
  4. 如果我们已经生成了一个一次性令牌,它在 Z 分钟内到期,并且密码重置URL包含此令牌。将此邮件发送到注册的电子邮件地址加载URL时,提示输入新密码并重置。
  5. 对于那些认为你应该告诉用户电子邮件去了哪里的人,我强烈不同意。这是“信息泄露”,即使您将其限制为域名。例如,我说我已经在JeffAtwoodEatsBabies.com上注册为blowdart。如果Jeff要求我重置密码并且您显示了注册域,那么他会看到idunno.org。这是我的个人领域,因此杰夫知道,吹风用户实际上就是我。这是一个坏的的事情。我不应该使用hotmail或gmail或其他任何东西注册,以保护自己免受代码向所有人显示电子邮件域名。

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

    您可以做的最后一件事是将CSRF令牌添加到重置请求页面,因此无法从其他网站驱动它。

    跟进

    所以回答你的进一步问题。

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

答案 1 :(得分:6)

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

相反,我迄今为止看到的最好的事情就是通过电子邮件发送已注册的电子邮件,其中包含将开始密码重置过程的链接。您甚至可以通过显示注册时使用的电子邮件地址的屏蔽版本来让用户知道要检查的电子邮件地址:

  

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

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

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

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