密码重置后端功能

Posted

技术标签:

【中文标题】密码重置后端功能【英文标题】:Password Reset Backend Functionality 【发布时间】:2013-09-12 13:01:14 【问题描述】:

如果用户忘记密码,我在如何从概念上处理密码重置方面遇到了一些麻烦。我一直在尝试在this 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";
  

【问题讨论】:

您可以考虑删除所有代码(和令人头疼的问题)并改用此代码:php-login.net 我认为您的verifyNewPassword.php 应该在if ($tokenFound) 部分内。因为在这里您还必须验证令牌。或者任何人都可以更改任何人的密码。您还应该在隐藏字段中发布 idusername 【参考方案1】:

我最终通过 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";
  

【讨论】:

【参考方案2】:

无论您以何种方式编写此内容,您都会在 verifyNewPassword.php 中需要这些 xxxyyy 值。最好的解决方案是在传递给 resetpassword.php 时将它们保存在隐藏输入中,将它们与 POST 值一起发送,并从 verifyNewPassword.php 再次验证它们。

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

【讨论】:

但是如何通过 POST 从 resetpassword.php 发送 xxx 和 yyy 值?我不知道该怎么做
.
在 HTML 表单中使用隐藏的输入,并复制值。 非常感谢。我不知道 html 的隐藏输入类型。

以上是关于密码重置后端功能的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak - 密码重置后自动登录

了解 Nodejs 和 Angular 中的密码重置

Prestashop 迁移 - URL 损坏、重定向错误,并且无法重置管理员密码/访问后端办公室

任意用户密码重置:重置凭证未校验

任意用户密码重置:重置凭证可暴破

任意用户密码重置的10种姿势