#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 за счет использования
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!';
}
Спасибо за советы, ребята.