Невозможно извлечь хеш пароля из базы данных с подготовленными утверждениями - PullRequest
0 голосов
/ 26 апреля 2018

РЕДАКТИРОВАТЬ: Чтобы уточнить, я не могу извлечь хешированный пароль из моей базы данных, используя подготовленные заявления.

Я пытаюсь создать систему входа в систему, которая использует подготовленные операторы, password_hash и password_verify.

Я создал регистрационную форму, которая создает пользователя с хешированным паролем, используя password_hash($_POST['password'], PASSWORD_DEFAULT);

Это работает правильно.

Однако я застрял при создании формы для входа.

Я пытаюсь получить хэш пароля, который сохраняется при регистрации пользователя, но я не могу заставить его работать с подготовленными утверждениями.

Это то, что у меня сейчас есть.

<?php
require('db.php');

if(isset($_POST['submit'])) {
  $stmt = $connect->prepare('SELECT user_name, user_password FROM `users` WHERE user_name = ?');

  if($stmt) {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $stmt->bind_param('s', $username);

    $stmt->execute();

  }
}

?>

Как использовать данные, полученные из запроса на выборку? И как мне использовать его для подтверждения пароля?

Я пытался:

$stmt->store_result();
$stmt->bind_result($loginUsername, $hash);

Это хранит только имя пользователя, но не хеш пароля, и я понятия не имею, почему.

Проверка пароля будет использовать это? password_verify($password, $hash);

UPDATE

<?php
require('db.php');

if(isset($_POST['submit'])) {
  $stmt = $connect->prepare('SELECT user_name, user_password FROM `users` WHERE user_name = ?');

  if($stmt) {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $stmt->bind_param('s', $username);

    $stmt->execute();

    // Get query results
    $result = $stmt->get_result();

    // Fetch the query results in a row
    while($row = $result->fetch_assoc()) {
      $hash = $row['user_password'];
      $username = $row['user_name'];
    }

    // Verify user's password $password being input and $hash being the stored hash
    if(password_verify($password, $hash)) {
      // Password is correct
    } else {
      // Password is incorrect
    }

  }
}

?>

1 Ответ

0 голосов
/ 26 апреля 2018

Прочитайте это PHP РУКОВОДСТВО . Попробуйте это:

 <?php
    require('db.php');

    if(isset($_POST['submit'])) {
      $stmt = $connect->prepare('SELECT user_name, user_password FROM `users` WHERE user_name = ?');

      if($stmt) {
        $username = $_POST['username'];
        $password = $_POST['password'];

        $stmt->bind_param('s', $username);

        $stmt->execute();

        // Get query results
        $stmt->bind_result($user_name,$hash);
        $stmt->store_result();

        // Fetch the query results in a row
        $stmt->fetch();

        // Verify user's password $password being input and $hash being the stored hash
        if(password_verify($password, $hash)) {
          // Password is correct
        } else {
          // Password is incorrect
        }

      }
    }

    ?>

Вот как я создал свою систему входа в систему:

$stmt = mysqli_prepare($link,"SELECT user_email,user_password,user_firstname,user_lastname,user_role,username FROM users WHERE user_email=?");
        mysqli_stmt_bind_param($stmt,"s",$email);
        mysqli_stmt_execute($stmt);
        confirmQuery($stmt);
        mysqli_stmt_bind_result($stmt,$user_email,$user_password,$user_firstname,$user_lastname,$user_role,$username);
        mysqli_stmt_store_result($stmt);
        mysqli_stmt_fetch($stmt);
        if(mysqli_stmt_num_rows($stmt) == 0)
            relocate("../index.php?auth_error=l1");
        else{
            if(password_verify($password,$user_password)){
                $_SESSION['userid'] = $user_email;
                $_SESSION['username'] = $username;
                $_SESSION['firstname'] = $user_firstname;
                $_SESSION['lastname'] = $user_lastname;
                $_SESSION['role'] = $user_role;
                if(isset($_POST['stay-logged-in']))
                    setcookie("userid", $email, time() + (86400 * 30), "/");
                relocate("../index.php?auth_success=1");
            }else
                relocate("../index.php?auth_error=l2");
        }
        mysqli_stmt_close($stmt);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...