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

anv*_*nvd 2 php mysql passwords hash

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

我希望用户能够点击"忘记密码?"这样的链接.单击时,用户将收到一封带有新密码的电子邮件.

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

谢谢!

ast*_*asr 7

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


文件和表格:

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

  1. 在tabase中创建一个新表,调用password_reset三列:userid这是指向表的外键users; code,其中包含一个唯一的随机数; 并且timestamp,它将包含发出请求的日期.

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

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

逻辑:

  1. 如果提供的用户名或电子邮件password_reset_request.php有效,请在password_reset与请求对应的表中插入一行.想象一下,用户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获得命中时,它应该检查URL中是否存在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.

你完成了!