Хэш-пароль в PHP, а не строка после извлечения из базы данных MYSQL

#php #mysql #hash #passwords

Вопрос:

У меня есть пароль для части входа в систему, которая использует $hash = password_hash($password, PASSWORD_DEFAULT);

Пароль хранится в базе данных в виде хэша, $2y$10$CaQON5WOEHcla58aBoIRKOmyYLBwtDHKFqk81y25.EGvjBqlF0W1W

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

Я проверил в MySQL workbench, работает ли запрос, который я использовал, и он возвращает пароль нормально.

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

Я пробовал $verify = password_verify($password, $hash); , однако, ошибка, которую я также получаю, заключается в том, что параметр 2 должен быть строкой.

Так почему же значение не является строкой после того, как я его получу? и как мне получить правильное значение?

Вот мой вопрос:

    $sql_e2 = "SELECT password FROM users WHERE email='$email'";
   $hash = mysqli_query($mysqli, $sql_e2);
 

Спасибо

Комментарии:

1. пожалуйста, покажите полный код, в котором вы запрашиваете базу данных и назначаете хэш пароля переменной — в приведенной выше $hash = mysqli_query($mysqli, $sql_e2); переменной $hash будет логическим — вам нужно получить fetch результаты перед назначением переменной

2. Ваш код, по — видимому, уязвим для внедрения sql за счет использования $email непосредственно в sql cmd-используйте prepared statements при использовании предоставленных пользователем данных

3. Функция mysqli_query() не возвращает значение, как вы ожидаете. Он возвращает объект mysqli_result при успешном выполнении или false при сбое. Итак, сначала вы должны проверить, возвращает ли он значение false или нет, и после этого обработайте объект mysqli_result (при успешном выполнении), извлекая строку (вы можете использовать mysqli_fetch_row).

Ответ №1:

Я закончил собирать то, что сейчас работает, и протестировал на рабочих и нерабочих учетных записях.

 //query SQL for password
        $sql_e2 = $mysqli->prepare("SELECT password FROM users WHERE email = ?");
        $sql_e2->bind_param("s", $email);
        $sql_e2->execute();
        $result = $sql_e2->get_result();

        //fetch row from result and assign value
        $row = mysqli_fetch_row($result);
        $hash = $row[0] ?? false;

        // Print the result depending if they match
        if (password_verify($password, $hash)) {
            echo 'Password Verified!';
        } else {
            echo 'Incorrect Password!';
        }
 

Спасибо за советы, ребята.