PHP password_verify не работает
Я решил попробовать освоить работу с MySQL через PHP по этому видео-уроку
У меня возникла проблема при проверке пароля, хэшированного помощью password_hash.
if (password_verify($data["password"],$user->password))
{
}
else
{
$errors[]="Неверный пароль";
}
И вне зависимости оттого, правильный или нет ввел я пароль, все равно выводит, что пароль неверный. Я нашел такие ответы на stackoverflow: обрезается хэшированный пароль, проблемы с кавычками. Ни одно из них не помогло - поле password стоит VARCHAR(191), а все кавычки в коде - двойные, кроме как в echo.
Вношу данные я так:
$user = R::dispense("users");
$user->login=$data["login"];
$user->email=$data["email"];
$user->password=password_hash($data["password"],PASSWORD_DEFAULT);
R::store($user);
echo "<div style='color: green;'>Вы успешно зарегистрировались</div><br>";
Кое-что странно: попробовал echo "$user->login" и echo "$user->password" - выводит пустоту, хотя $user->login присутствует при проверки существования пользователя с таким логином и работает корректно, так что $user->login не должен быть пустым... Определяю $user через $user=R::find("users","login=?",array($data["login"]));
Ответы (2 шт):
Вы используете стиль ООП, похвально. Но думаю проблема могла затеряться в нем. Мне проще писать в процедурном стиле. Также могу порекомендовать более мощный движок шифрования PASSWORD_BCRYPT (насколько я помню в доках написано что он помощнее дефолтного). Также предупреждаю после обновления php шифрования PASSWORD_DEFAULT то есть то которое по умолчанию может поменяться! В доках так и написано поэтому нужно четко указать алгоритм иначе после обновления php МОЖЕТ больше не работать сайт, ибо хешы и методы будут разные! Попробуйте этот скрипт. $password = "Ваш тестовый пароль";
<?php
$password = "passw2";
echo ("Введенный пароль ->".$password);
echo "<br>";
$hash = password_hash($password, PASSWORD_BCRYPT);
echo "Hash ->$hash";
echo "<br>";
if (password_verify($password, $hash)) {
echo 'Пароль правильный!';
} else {
echo 'Пароль неправильный.';
}
?>
Оказалось, проблема в строчке с определением $user ($user=R::find("users","login=?",array($data["login"]));) Если заменить find на findOne, то все заработает!