如果用户忘记了密码,我在如何从概念上处理密码重置方面遇到了一些麻烦。在这个SO 答案之后,我一直在尝试为我的系统建模。
这是我当前的设置:
- 用户点击页面上的忘记密码链接
- 该页面提示他们输入他们的电子邮件地址
- 用户输入电子邮件地址并点击“向我发送我的信息”
- 当用户点击“发送我的信息”时,会在我的 password_change_requests 表中创建一个新条目,其中包含随机 id、时间和用户的用户名。
- 我向用户发送格式为的链接
http://mysite.net/resetpassword.php?id=xxx&username=yyy
- resetpassword.php 文件获取 id 和用户名
- resetpassword.php 检查 password_change_requests 中的行,该行具有用户名和尚未过期的时间
- 如果找到行,则确保 get 中的 id 与该行中的散列 id 匹配。
- 如果 id 已验证,则使用表单和按钮回显 html 以输入新密码
- 尝试将新密码发送到验证新密码并确认新密码匹配的不同 php 脚本。
verifyNewPassword.php
我的设计一定是有缺陷的,因为如果verifyNewPassword.php 中的密码不匹配,我无法弄清楚如何将用户发送回resetpassword.php。我不能只给他们一个链接以单击将他们发送回 resetpassword.php,因为该链接还需要来自 GET 的 id 和用户名。我尝试将 GET 数据从 resetpassword.php 发送到 verifyNewPassword.php,但我无法弄清楚,因为 html 在回显中。这是我的代码的摘要:
重置密码.php:
if ($tokenFound) {
echo "<html>
<body>
<h1>Password Reset</h1>
<form action='verifyNewPassword.php' method='post'>
<input type='password' name='password' placeholder='New Password'><br>
<input type='password' name='confirmpassword' placeholder='Confirm New Password'><br><br>
<input type='submit' value='Reset Password'>
</form>
</body>
</html>";
}
else {
//notify user token is expired or not found. try to reset password again
echo "not a valid token";
}
验证新密码.php:
if ($password != $confirmpassword) {
print "Passwords don't match. Click <a href=\"resetpassword.php\">here</a> to try again.<br/>";
}
else {
echo "passes match";
}