Проверьте хешированные пароли из базы данных MySQL, используя Подготовленные заявления - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь проверить хешированный пароль моего пользователя из моей базы данных MySQL, используя функции password_hash() и password_verify(). Я пытаюсь сделать это с подготовленными заявлениями PHP для дополнительной безопасности, но безуспешно. Кто-нибудь знает почему?

Вот код:

//check if password is linked to username
$checkpass = $conn->prepare("SELECT user_password FROM user_details WHERE user_password=?");
$checkpass->bind_param("s", $preppass);
$preppass = $password;
$getpass = $checkpass->execute();

//get and check result
$checkpass->bind_result($getpass);
$checkpass->fetch();
if (!password_verify($password, $getpass)) {
    echo "<script>console.log('Incorrect username or password!')</script>";
    return false;
    exit;
}
echo "S<script>console.log('Successfully logged in!')</script>";
$conn->close();

, а вот база данных:

Структура базы данных

Что я пробовал :

Невозможно извлечь пароль ha sh из базы данных с подготовленными утверждениями

Проверить хешированный пароль из базы данных

I был бы очень признателен за помощь.

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Вы должны искать хешированный пароль, используя имя пользователя, а не пароль, потому что вы не знаете, что такое хешированный пароль. Затем вы используете password_verify(), чтобы проверить, соответствует ли введенный пароль хешированному паролю.

$checkpass = $conn->prepare("SELECT user_password FROM user_details WHERE username=?");
$checkpass->bind_param("s", $username);
$checkpass->execute();

//get and check result
$checkpass->bind_result($getpass);
$checkpass->fetch();
if (!password_verify($password, $getpass)) {
    echo "<script>console.log('Incorrect username or password!')</script>";
    return false;
    exit;
}
echo "S<script>console.log('Successfully logged in!')</script>";
$conn->close();
0 голосов
/ 25 апреля 2020

Поскольку ваш подготовленный оператор SQL использует ? (WHERE user_password=?"), похоже, $checkpass->bind_param("s", $preppass); пытается связать $prepass с параметром :s, который не существует.

Либо используйте WHERE user_password=:s" (объявите именованный параметр оператора), либо $checkpass->bind_param(1, $preppass); (свяжите ваш простой пароль с первым ? в операторе).

Согласно документация. .

...