密码重置后端功能

时间:2013-09-09 04:26:22

标签: php mysql passwords

如果用户忘记密码,我在如何从概念上处理密码重置方面遇到了一些麻烦。在this SO回答之后,我一直在尝试对我的系统进行建模。

这是我目前的设置:

  1. 用户点击页面上的忘记密码链接
  2. 该页面提示他们输入他们的电子邮件地址
  3. 用户输入电子邮件地址并点击“发送给我我的信息”
  4. 当用户点击“发送我的信息”时,会在我的password_change_requests表中创建一个新条目,其中包含随机ID,时间和用户的用户名。
  5. 我向用户发送格式为http://mysite.net/resetpassword.php?id=xxx&username=yyy
  6. 的链接
  7. resetpassword.php文件获取ID和用户名
  8. resetpassword.php检查password_change_requests中具有用户名和尚未过期时间的行
  9. 如果找到了行,则确保get中的id匹配该行中的哈希id。
  10. 如果验证了id,则使用表单和按钮回显html以输入新密码
  11. 尝试将新密码发送到验证新密码并确认新密码匹配的其他php脚本。 verifyNewPassword.php
  12. 我的设计必须以某种方式存在缺陷,因为如果密码在verifyNewPassword.php中不匹配,我无法弄清楚如何将用户发送回resetpassword.php。我不能只给他们一个链接点击发送回resetpassword.php,因为该链接还需要来自GET的id和用户名。我尝试将来自resetpassword.php的GET数据发送到verifyNewPassword.php,但由于html位于echo中,我无法弄明白。以下是我的代码摘要:

    resetpassword.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";
      }
    

    verifyNewPassword.php:

    if ($password != $confirmpassword) {
        print "Passwords don't match. Click <a href=\"resetpassword.php\">here</a> to try again.<br/>";
      }
      else {
        echo "passes match";
      }
    

2 个答案:

答案 0 :(得分:1)

您写这篇文章的任何方式,在verifyNewPassword.php中需要这些xxxyyy值。当传递给resetpassword.php时,最佳解决方案会将这些保存在隐藏输入中,与POSTed值一起发送,并再次从verifyNewPassword.php验证它们。

如果要避免链接,可以发送303响应并将Location标头设置为http://mysite.net/resetpassword.php?id=xxx&username=yyy,如果要显示错误消息,则设置另一个可选标志。

答案 1 :(得分:0)

我最终将resetpassword中的id和username值传递给验证密码,如下所示:

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="hidden" name="username" value="' . $username . '">
<input type="hidden" name="id" value="' . $id . '">
<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";
  }