【问题标题】:Security of password reset in ASP.NET appASP.NET 应用程序中密码重置的安全性
【发布时间】:2011-02-01 16:55:15
【问题描述】:
我有一个允许用户重置密码的 ASP.NET。
过程是
- 用户通过电子邮件单击重置链接。该链接包含一个安全令牌。
- 用户被带到应用的第 1 页并回答安全问题
- 如果问题正确,请转到第 2 页并重置密码。
所有数据都安全地存储在数据库等中。我主要关心的是第 1 页和第 2 页之间的交互,并确保人们不能直接进入第 2 页更改密码。
为了防止这种情况发生,我打算这样做。
- 在第 2 页时始终检查引荐页面是否为第 1 页,如果不是则退回
- 将包含在会话中的电子邮件链接中的安全令牌放在第 1 页的会话中,并且仅允许在会话中使用第 2 页。
- 会话超时时间短,因此输入密码的时间有限。也可以在数据库中记录他们完成第 1 页的时间。
我的问题是。 这是一个狡猾的计划还是有人能看出其中的缺陷吗?
【问题讨论】:
标签:
c#
asp.net
security
session-state
【解决方案1】:
您计划的第 1 步可能效果不佳,不建议依赖可用的引荐来源网址值,因为它 a) 容易被欺骗,b) 经常被偏执的用户禁用。
第 2 步听起来你想实现一个 CSRF 令牌类型的方法,这是个好主意。
主要要保护的是电子邮件中发送的安全令牌,只要攻击者在不阅读电子邮件的情况下无法确定该令牌,则相对安全。如果攻击者可以阅读用户的电子邮件,那么几乎所有的密码恢复方案都会被破坏。
【解决方案2】:
我认为令牌应该存储在数据库中并在以下情况下失效:
- 经过一定的时间跨度
- 新电子邮件已生成
- 用户重置密码
【解决方案3】:
为什么不让用户保持在同一页面上呢?
我会使用WizardControl。
如果您决定继续使用两页方法,则可以在正确回答给定令牌的安全问题时在数据库中设置一个标志。在第 2 页中,您检查是否设置了标志,如果没有 -> 重定向到第 1 页。