2009-06-24 181 views
4

所以,我一直在玩asp:PasswordRecovery,我发现我真的不喜欢它,有以下几个原因:密码恢复,而不通过电子邮件发送密码

1)Alice的密码,甚至可以无需访问重置爱丽丝电子邮件。密码重置的安全问题缓解了这一点,但并不能真正让我满意。

2)Alice的新密码以明文形式发回给她。我宁愿给她发一个特殊的链接到我的网页上(例如像example.com/recovery.aspx?P=lfaj0831uefjc这样的网页),这会让她改变她的密码。

我想我可以通过创建某种类型的过期密码恢复页面表并将这些页面发送给要求重置的用户来完成此操作。不知何故,这些页面也可能会在后台更改用户密码(例如,通过手动重置它们,然后使用新密码的文本更改密码,因为如果不知道旧密码,就不能更改密码)。我相信其他人以前曾经遇到这个问题,这种解决方案让我觉得有点难以理解。有一个更好的方法吗?

理想的解决方案不是通过直接访问数据库来违反封装,而是使用数据库中现有的存储过程......尽管这可能是不可能的。

回答

4

我目前在Spring + SpringSecurity之上实现了一个开源的user management system,这里是我解决密码丢失问题的方法。

  1. 用户的帐户必须具有预先注册的电子邮件地址。
  2. 要请求重置,用户将其帐户名称输入到表单中。
  3. 生成一个临时“重置代码”并将其附加到该帐户,并通过电子邮件发送给嵌入在超链接中的用户。
  4. 收到电子邮件后,用户点击链接,将其带到页面以输入新密码。
  5. 在接受新密码之前,会根据存储的代码检查重置代码(来自链接),以确保它是正确的并且没有过期。

这样可以避免在电子邮件中发送密码(清除)。而且它还可以防止一个人重置另一个人的密码,这只是一个麻烦,因为密码重置只发生在链接使用后。

但它确实依赖于用户的电子邮件帐户是安全的,并且电子邮件在传输过程中不被窥探。对于某些应用来说,这可能是不可接受的风险。

另一个等式是您需要非常小心地更改用户的注册电子邮件地址。至少,用户必须输入其当前的密码以及更改地址的请求......以防止通过无人参与登录会话进行黑客攻击。

+0

嗯,这与我的问题表明我可以做的几乎相同。 – Brian 2010-04-02 19:26:04

2

我建议添加额外的检查级别,这里有一些选项可供选择。

  1. 首先,您可以将请求者的IP地址保存到数据库中,然后当他们单击重置链接时将其与当前机器的IP地址相比较,如果它们匹配,则重置密码。如果电子邮件被拦截,那么试图重置密码的人必须具有匹配的IP地址。
  2. 使用cookie并存储一个唯一值,可能是一个GUID,MD5哈希值或其他值。因此,当用户发出密码重置请求时,cookie会存储在他们的机器和数据库中,当用户单击链接时,本地cookie必须与数据库值匹配,否则他们将无法重置密码。

一般来说,我完全反对在Email中发送密码,所以我喜欢密码重置链接选项而不是新的纯文本密码。

相关问题