【问题标题】:PHP wont reset the passwordPHP不会重置密码
【发布时间】:2019-07-31 23:11:47
【问题描述】:

我正在尝试使用 php 创建密码重置页面。但我遇到的问题是当我输入新密码然后按重置按钮时,程序将创建一个随机密码并将其保存在数据库中。不是我之前输入的那个。谢谢。

这是我使用的代码:

    <?php
    require_once 'inc/dbconnection.php';
    if(isset($_POST["reset-password"])){
        $name = $_GET["Fname"];
        $password = trim($_POST["password"]);
        $confirmPassword = trim($_POST["confirmPassword"]);
        if($password == $confirmPassword) {
           $password = password_hash($password, PASSWORD_DEFAULT);
           $stmt = $db->prepare("UPDATE sec SET password= ? WHERE Fname = ?");
           $stmt->execute(array($password,$name));
           $affected_rows = $stmt->rowCount();
           if($affected_rows) {
               $success_message = "Password is reset successfully.<br>Now you are redirecting";
               header("Refresh:3; url=loginSf.html");
           } else {
               $error_message = "Failed : <br> Password not updated";
           }} else {
            $error_message = "Password not matched";
      }  } ?>
<!DOCTYPE html>
<html>
    <head>
        <title>Reset Password</title>
      <link rel="stylesheet" type="text/css" href="styless.css">
    </head>
    <body>
      <br><br><div id="sidebar-left"></div>
      <div class="reset"> Reset password </div><br><br>
  <form id="reserPassword" action="new_pass.php" name="reserPassword" method="post">
              <br><br><br><br><br><br><br><br><br><br>
                <div id="borr"> Reset Password<br>
                <?php if(!empty($success_message)) { ?>
                <?php echo $success_message ?>
                <?php } ?>
                <?php if(!empty($error_message)) { ?>
                <?php echo $error_message ?>
              <?php } ?>
              <br>  <input type="password" id="password" name="password" placeholder="Enter a New Password" required>
              <br>  <input type="password" id="confirmPassword" name="confirmPassword" placeholder="Confirm Password" required>
                <br><input type="submit" value="Reset Password" name="reset-password" id="forget-password">  </form></div></body></html>

【问题讨论】:

  • 您是否尝试在逻辑位置上使用var_dump($var); exit(); 进行调试,以查看代码因可能的错误值而停止正常工作的位置?
  • “程序将创建一个随机密码” - 上面的代码中没有任何内容可以“生成”任何密码。不过,您确实对密码进行了哈希处理(这很好)。如果这就是你所指的,那每次都会给你一个新的哈希值,但这是应该的。
  • 感谢您的回答,但是.. 我希望当我输入新密码时,它将按原样保存在数据库中,发生在我身上的是程序将保存另一个随机密码。跨度>

标签: php mysql reset-password


【解决方案1】:

让我猜猜:你的数据库中有$2y$10$nUT/9PN0hVuk0q3ci6aSJer1Ln05UGmWDTELUzAKU46qUExZZOD1W 之类的东西吗? password_hash 用于散列密码[1],以便它们不会以纯文本形式存储在数据库中。

它是 PHP 密码散列函数的一部分[3]。正如您所说,存储了一个“随机”密码,我猜您没想到会这样,而是按照告诉您或在示例中使用的功能使用了此功能。

所以你应该阅读相应的功能来检查密码,用户用于登录的密码是否正确:password_verify[2]。

一个小例子:

$password = 'im_an_apple';
// creates a hash with the current default algorithm
$hashed = password_hash($password, PASSWORD_DEFAULT);
echo $hashed;
// e.g. $2y$10$nUT/9PN0hVuk0q3ci6aSJer1Ln05UGmWDTELUzAKU46qUExZZOD1W
// this string holds all needed informations:
// used hashing algorithm, salt, hash

// to verify this:
$verifiesPW = password_verify($password, $hashed);
$verifiesRandom = password_verify('assdfghj', $hashed);

var_dump($verifiesPW); // true
var_dump($verifiesRandom); // false

由于您的数据库中可能还有一些纯文本密码,因此您的登录脚本可能包含以下内容:

$passwordFromInput = 'im_a_banana';
$passwordFromDB = 'im_a_banana';


$isCorrectPassword = false;
$needsHash = password_get_info($passwordFromDB)['algoName'] === 'unknown'; //true

if ($needsHash) {
    $isCorrectPassword = $passwordFromInput === $passwordFromDB;
} else {
    $isCorrectPassword = password_verify($passwordFromInput, $passwordFromDB);
}

if ($isCorrectPassword && $needsHash) {
    $passwordHash = password_hash($passwordFromInput, PASSWORD_DEFAULT);
    // store $passwordHash in db
}

这使用password_get_info[4] 来检查所使用的散列算法。如果密码没有经过哈希处理,它将返回unknown 作为哈希算法。所以用户登录时密码会以哈希的形式存储。

参考文献:

[1]https://security.stackexchange.com/questions/41447/why-is-password-hashing-considered-so-important

[2]http://php.net/manual/en/function.password-verify.php

[3]http://php.net/manual/en/ref.password.php

【讨论】:

  • 不只是发布示例的链接,您应该将它们包含在答案中并将链接添加为参考。
  • 我也想知道这个答案与这个用户案例中的密码重置有什么关系...password_verify() 是为了在登录时验证密码
  • @kuh-chan 谢谢你的帮助..所以会发生什么是新密码将转换为哈希形式然后它将保存在数据库中,所以当用户尝试登录时新密码将与数据库中的哈希不匹配。所以我需要验证密码以匹配我的数据库中的哈希。好的,我应该在登录页面中进行验证吗?抱歉我的问题我还是学生。
  • 是的。验证应该在登录脚本中进行。我会更新我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
相关资源
最近更新 更多