PHP не сбрасывает пароль - PullRequest
       30

PHP не сбрасывает пароль

0 голосов
/ 10 марта 2019

Я пытаюсь создать страницу сброса пароля с помощью 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>

1 Ответ

1 голос
/ 10 марта 2019

Позвольте мне угадать: у вас есть что-то вроде $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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...