>具有登录ID和电子邮件ID和CAPTCHA的输入框的表单
>当用户输入详细信息并提交时,在验证后的后端生成新密码并在数据库中替换旧密码.
>新的passowrd通过电子邮件发送给用户.
请帮助我,不管我做得对不对?
是否还有其他安全机制?
[编辑]
谢谢,我收到你的回复.真的,这是一种安全的机制.但在这里我几乎没有怀疑
>当他在忘记密码页面输入loginId和电子邮件地址时,我应该向用户显示什么消息?
>对于有效用户和恶意用户,消息是否相同?
>使用CSRF令牌的好处?任何帮助/链接
>当用户点击链接时,我应该怎么做;因为我猜用户应该自动登录到他们的帐户 – 然后我有2个选择(第一个)自动向用户发送新密码(第二个)新表单将显示给用户,用户将使用旧密码和新密码两次?
请帮忙?
解决方法
>当请求密码重置时,检查在最后X分钟内是否尚未为该帐户请求重置.如果已经请求了密码,则忽略重置请求.
>检查请求密码重置的IP.如果该IP请求在最后Y分钟重置密码,则忽略该请求.
>如果1和1中的检查2通过检查帐户是否存在.如果它不忽略该请求.
>如果我们已经实现了这一点,那么生成一次性令牌,该令牌在Z分钟后到期,并且密码重置URL包含此令牌.通过电子邮件发送到注册的电子邮箱加载URL时,提示输入新密码并重置.
对于那些认为你应该告诉用户电子邮件去了哪里的人我非常不同意.这是“信息泄露”,即使您将其限制为域名.例如,我说我已经在JeffAtwoodEatsBabies.com上注册为blowdart.如果杰夫要求我重置密码并且您显示了注册域,那么他会看到idunno.org.这是我的个人领域,因此杰夫知道,吹风用户实际上就是我.这是一件坏事.我不应该使用hotmail或gmail或其他任何方式注册,以保护自己免受代码向所有人显示电子邮件域名.
此外,您根本不应该显示错误消息.无论发生什么情况,用户名实际上都没有注册,或者请求太多或天空已经下降,您应该告诉用户密码重置过程已经开始.通知用户帐户不存在是更多信息泄露.
您可以做的最后一件事是将CSRF令牌添加到重置请求页面,因此无法从其他网站驱动它.
跟进
所以回答你的进一步问题.
>您显示的信息取决于您. “重置密码的说明已通过电子邮件发送到此帐户的注册电子邮件”是一个想法,但实际上这取决于您的受众.
>上面已经说过了.
>维基百科是一个很好的starting point.你如何做到这取决于你的平台,是一个完整的其他问题!对于ASP.NET,您可以查看我的codeplex项目,http://anticsrf.codeplex.com或查看ViewStateUserKey.>当点击链接时,我首先会根据应用的用户名验证URL中的令牌,然后我会允许用户输入新密码,或者生成一个新密码并通过电子邮件发送.你不能提示旧的,因为整点是用户已经忘记了它!