Где ошибка в коде и не происходит авторизация с password_verify?

Есть в таблице users столбцы login и password. Есть страница с окнами ввода логина и пароля ( c именами username и password). Ниже часть кода php.

$myusername = mysqli_real_escape_string($conn,$_POST['username']);
$mypassword = mysqli_real_escape_string($conn,$_POST['password']);
$sql = "SELECT * FROM users WHERE login = '$myusername'";
$result = mysqli_query($conn,$sql);
$row = mysqli_fetch_array($result,MYSQLI_ASSOC);
$count = mysqli_num_rows($result);
if($count == 1 && password_verify($mypassword, $row['password']))
{$_SESSION['login_user'] = $myusername;
header("location: xxxxx.php");}
else {$error = "Неправильный логин или пароль";}


Что в нем не так? Я уже много гуглил, никак не понимаю что не так. Должны же сравниваться хеши логина из базы и из формы, но что то не то. Авторизации нет. Помогите пожалуйста. Что поменять в коде и что добавить, или нужно что-то менять в базе? Где то нашел что пароль в базе нужно хранить в виде хеша, но какой смысл если на сайте он каждый раз будет разный. Я сначала подумал, что может нужно до password_verify хешировать пароль из формы, но это не помогло.
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 3
SagePtr
@SagePtr
Еда - это святое
Да, в базе пароль нужно хранить в виде хеша, полученного функцией password_hash. Он каждый раз разный, потому что соль генерируется каждый раз своя, но эта соль включена в хеш, и функция password_verify эту соль учитывает.
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Во-первых $mypassword не участвует в SQL-запросах, поэтому его НЕ НАДО экранировать, этим вы портите сам пароль. Сами подумайте, текст пароля aaa\'bbb совпадёт с оригинальным паролем aaa'bbb?

Во-вторых, просто сделайте в блоке else{} такой код:
$salt = strstr(strstr(strstr($row['password'], ".", true), "\$"), "\$");
error_log("PHP: Password: '{$_POST['password']}', '".password_hash($_POST['password'], PASSWORD_DEFAULT, array('salt' => $salt))."' != '{$row['password']}', salt = '{$salt}'");

и смотрите error.log вашего HTTP-сервера, сравнивайте хэши паролей. Думаю если в шифровании что-то не так - сами поправите код.
Ответ написан
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Возможные причины
1. В БД нет такого пользователя.
2. Недостаточная длина поля под хэш.
3. Ошибка при выполнении запроса.
4. При регистрации в базу вместо нормального хэша пишется какая-то ерунда.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы