最安全的方法是通过电子邮件向该人发送指向允许他们创建新密码的页面的链接.密码只能存储为盐渍哈希.颠覆这一过程将要求一个人的电子邮件遭到入侵 - 在这种情况下,他们可能会遇到比您的webapp密码泄露更严重的问题.
我想你的数据库包含一个名为"users"的表,其中一个名为"userid"的列作为其主键.
在tabase中创建一个新表,调用password_reset三列:userid这是指向表的外键users; code,其中包含一个唯一的随机数; 并且timestamp,它将包含发出请求的日期.
创建一个密码重置页面,例如password_reset_request.php.询问用户名或电子邮件.
创建一个用于设置新密码的页面,例如set_new_password.php.
如果提供的用户名或电子邮件password_reset_request.php有效,请在password_reset与请求对应的表中插入一行.想象一下,用户Fel已经设置了密码重置请求. 费尔的内部userid可能是564979.这一行将password_reset是这样的: 564979, 54c4a2767c2f485185ab72cdcf03ab59, 2011-01-01 12:00:00.
发送电子邮件到用户的电子邮件地址,其中包含一个如下所示的网址: 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.
你完成了!