如何在PHP / MySQL Web应用程序中安全地为用户提供新密码?

时间:2011-03-20 17:17:26

标签: php mysql hash passwords

我有一个简单的问题。为用户执行密码恢复的最佳方法是什么?

我希望用户能够点击“忘记密码?”这样的链接。点击后,用户将收到一封包含新密码的电子邮件。

我认为发送哈希是一个不好的选择,然后我必须生成一个随机密码,转换为哈希+随机盐,在数据库中替换它并通过电子邮件发送新的随机密码。这是最好的方式,还是另一种方式?更简单更好。

谢谢!

3 个答案:

答案 0 :(得分:7)

最安全的方法是通过电子邮件向该人发送指向允许他们创建新密码的页面的链接。密码只能存储为盐渍哈希。颠覆这一过程将要求一个人的电子邮件遭到入侵 - 在这种情况下,他们可能会遇到比网络应用程序密码泄露更严重的问题。


文件和表格:

我想你的数据库包含一个名为“users”的表,其中一个名为“userid”的列作为其主键。

  1. 在名为password_reset的tabase中创建一个包含三列的新表:userid,这是指向表users的外键; code,其中包含一个唯一的随机数;和timestamp,其中包含请求的日期。

  2. 创建密码重置页面,例如password_reset_request.php。询问用户名或电子邮件。

  3. 创建用于设置新密码的页面,例如set_new_password.php

  4. 逻辑:

    1. 如果提供给password_reset_request.php的用户名或电子邮件有效,请在与该请求对应的password_reset表中插入一行。想象一下,用户 Fel 已经设置了密码重置请求。 Fel 的内部userid可能 564979 password_reset中的行可以是这些行:564979, 54c4a2767c2f485185ab72cdcf03ab59, 2011-01-01 12:00:00

    2. 向用户的电子邮件地址发送电子邮件,其中包含如下所示的网址:http://your.url/set_new_password.php?userid=564979&code=54c4a2767c2f485185ab72cdcf03ab59

    3. set_new_password.php被点击时,它应检查网址中是否存在useridcode属性。不在那里?的中止。

    4. 如果useridcode属性存在,请对其进行清理。这很重要。

    5. 运行如下SQL命令:SELECT * FROM password_reset pr WHERE pr.userid = $userid AND pr.code = $code AND TIMESTAMPDIFF(DAY, CURTIME(), pr.timestamp) < 1

    6. 如果您没有收到任何结果,中止。

    7. 如果您收到结果,请允许用户输入新密码。

    8. 按照通常在注册时验证密码后,使用SQL UPDATE语句更改用户密码。

    9. 使用SQL从password_reset表中删除对用户的任何请求:DELETE * FROM password_reset WHERE userid = $userid

    10. 你已经完成了!

答案 1 :(得分:0)

我会做以下

  1. 用户请求密码重置
  2. 用户输入用户名或密码
  3. 电子邮件通过链接发送给用户,该链接具有放置在数据库表(例如pwrecovery)中的唯一哈希 - 此链接类似于:http://domain.com/pwrecover.php?key=KEYHERE
  4. 用户点击该链接,如果表中存在哈希,则会收到另一封带有新密码的电子邮件。
  5. 这样,当用户收到正确的电子邮件时,用户不会发现他们的密码被随机用户更改。

答案 2 :(得分:0)

您应该通过电子邮件发送带有安全问题的网页链接(以及防止他人获得其他人安全问题的唯一代码)。

回答完问题后,允许用户创建新密码。