【发布时间】:2011-07-19 05:04:22
【问题描述】:
我有一个简单的问题。为用户恢复密码的最佳方法是什么?
我希望用户能够单击“忘记密码?”之类的链接。点击后,用户将收到一封包含新密码的电子邮件。
我认为发送哈希是一个不好的选择,那么我必须生成一个随机密码,转换为哈希+随机盐,在数据库中替换它并通过电子邮件发送新的随机密码。这是最好的方法,还是有其他方法?越简单越好。
谢谢!
【问题讨论】:
我有一个简单的问题。为用户恢复密码的最佳方法是什么?
我希望用户能够单击“忘记密码?”之类的链接。点击后,用户将收到一封包含新密码的电子邮件。
我认为发送哈希是一个不好的选择,那么我必须生成一个随机密码,转换为哈希+随机盐,在数据库中替换它并通过电子邮件发送新的随机密码。这是最好的方法,还是有其他方法?越简单越好。
谢谢!
【问题讨论】:
我会做以下事情
这样,用户在收到正确的电子邮件时不会发现他们的密码被随机用户更改。
【讨论】:
您应该通过电子邮件发送一个指向带有安全问题的页面的链接(以及防止人们获取其他人的安全问题的唯一代码)。
回答问题后,允许用户创建新密码。
【讨论】:
最安全的方法是通过电子邮件向此人发送指向允许他们创建新密码的页面的链接。密码只能存储为加盐哈希。破坏这个过程需要一个人的电子邮件被泄露——在这种情况下,他们可能会遇到比你的 web 应用程序密码泄露更严重的问题。
我想您的数据库包含一个名为“users”的表,其中一个名为“userid”的列用作其主键。
在您的数据库中创建一个名为password_reset 的新表,其中包含三列:userid,它是指向表users 的外键; code,它将包含一个唯一的随机数;和timestamp,它将包含发出请求的日期。
创建一个密码重置页面,例如password_reset_request.php。要求提供用户名或电子邮件。
创建一个用于设置新密码的页面,例如set_new_password.php。
如果提供给password_reset_request.php 的用户名或电子邮件有效,则在password_reset 表中插入与请求对应的行。假设用户 Fel 提出了密码重置请求。 Fel 的内部 userid 可能是 564979。 password_reset 中的行大致如下:564979, 54c4a2767c2f485185ab72cdcf03ab59, 2011-01-01 12:00:00。
向用户的电子邮件地址发送一封电子邮件,其中包含如下所示的 URL:http://your.url/set_new_password.php?userid=564979&code=54c4a2767c2f485185ab72cdcf03ab59。
当set_new_password.php 被点击时,它应该检查URL 中是否存在userid 和code 属性。不在那里? 中止。
清理userid 和code 属性(如果它们存在)。这很重要。
运行如下 SQL 命令:SELECT * FROM password_reset pr WHERE pr.userid = $userid AND pr.code = $code AND TIMESTAMPDIFF(DAY, CURTIME(), pr.timestamp) < 1。
如果您没有收到任何结果,中止。
如果收到结果,请允许用户输入新密码。
按照注册时的常规验证密码后,使用 SQL UPDATE 语句更改用户密码。
使用 SQL 从password_reset 表中删除对用户的所有请求:DELETE * FROM password_reset WHERE userid = $userid。
你已经完成了!
【讨论】: