Не работает password_verify() в PHP
Уважаемые любители и профессионалы, подскажите пожалуйста, где собака зарыта?
Есть обработчики регистрации и авторизации (в одном файле) и всё работает отлично кроме одного - пишет НЕ ВЕРНЫЙ ЛОГИН ИЛИ ПАРОЛЬ
Вот код:
//Регистрация пользователей
function checkUser($mysqli, $login, $name) {
$stmt = $mysqli->prepare("SELECT * FROM users WHERE login=? or name=?");
$stmt->bind_param("ss", $login, $name);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_assoc();
}
function regUser($mysqli, $login, $pass, $name, $status) {
//$pass = password_hash($pass, PASSWORD_DEFAULT);
$sql = "INSERT INTO `users` (`login`, `name`, `pass`, `status`, `regdate`) VALUES(?,?,?,?, NOW())";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("ssss", $login, $pass, $name, $status);
$stmt->execute();
}
$errors = [];
$meslogin = [];
$usercheck = checkUser($mysqli, $_POST['login'], $_POST['name']);
if ($usercheck && isset($_POST['reg'])) {
if($_POST['login'] == ''){
$errors[] = "Введите логин";
}
if($_POST['name'] == ''){
$errors[] = "Введите отображаемое имя";
}
if($_POST['pass'] == ''){
$errors[] = "Введите пароль";
}
if ($usercheck['login'] == $_POST['login']) {
$errors[] = "Введённый логин уже занят";
}
if ($usercheck['name'] == $_POST['name']) {
$errors[] = "Введённое имя уже занято";
}
}
if (isset($_POST['reg']) && !$errors) {
regUser($mysqli, $_POST['login'], $_POST['name'], $_POST['pass'], $_POST['status']);
echo "<script>alert('Регистрация успешно завершена! Войдите используя ваш логин и пароль.')</script>";;
} else {
$error = '<div id="errors">'.array_shift($errors).'</div>';
}
//авторизация пользователей
function loginIn($mysqli, $login, $pass){
$logins = $mysqli->prepare("SELECT * FROM users WHERE login=? AND pass=?");
//$pass = password_verify($_POST['pass'], $user['pass']);
$logins->bind_param("ss", $login, $pass);
$logins->execute();
$resultlogin = $logins->get_result();
return $resultlogin->fetch_assoc();
}
$logs = loginIn($mysqli, $_POST['loginlog'], $_POST['passlog']);
if (isset($_POST['reglog'])) {
if($_POST['loginlog'] == ''){
$errors[] = "Вы не ввели логин";
}
if($_POST['passlog'] == ''){
$errors[] = "Вы не ввели пароль";
}
if($logs['login'] != $_POST['loginlog']){
$errors[] = "Неверный логин или пароль";
}
if($logs['pass'] != $_POST['passlog']){
$errors[] = "Неверный пароль или пароль";
}
if (!$errors && $logs) {
$_SESSION['USER_NAME'] = $logs['name'];
$_SESSION['USER_REGDATE'] = $logs['regdate'];
$_SESSION['USER_LOGIN'] = 1;
$_SESSION['LOGIN'] = 1;
exit(header('Location: /'));
} else {
$error = '<div id="errors">'.array_shift($errors).'</div>';
}
}
ОДИН МОМЕНТ - сейчас пароли находятся в базе в в том виде, в каком их вводили пользователи, так как функция password_hash закомментирована (если раскомментировать, то она хэширует всё как надо в базе и вопросов нет).
Вопрос касается функции password_verify, дело всё в ней я подозреваю.
Помогите пожалуйста решить вопрос, так как при хэшировании выдаёт НЕ ВЕРНЫЙ ЛОГИН ИЛИ ПАРОЛЬ
Ответы (2 шт):
Функция password_verify() принимает два аргумента строка пароля "12345" и хеш данного пароля от функции password_hash(), тоисть вам нужно изменить код добавления пароля в базу данных:
function regUser($mysqli, $login, $name, $pass) {
//$pass = password_hash($pass, PASSWORD_DEFAULT);
$sql = "INSERT INTO `users` (`login`, `name`, `pass`, `regdate`) VALUES(?,?,?, NOW())";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("sss", $login, $name, password_hash($pass, PASSWORD_DEFAULT));
$stmt->execute();
}
и тогда вы сможете использовать password_verify()
В 99 случаев из ста, если password_verify() возвращает false, это значит, что в БД для хэша выделено поле недостаточной длины. Она должна быть как минимум 60, но лучше сразу сделать varchar(255) на будущее.
В остальных случаях это либо просто путаница, когда пользователь перепутал пароли, либо какая-нибудь кривая функция, которая зачем-то портит пароль перед хэшированием.
Как убедиться, что с password_verify() всё в порядке, а проблема в вашем собственном коде?
Выведите на экран значения пароля и хэша в скрипте регистрации перед сохранением в базу, и скопируйте результат в какой-нибудь текстовый файл:
var_dump($password); $hash = password_hash($password, PASSWORD_DEFAULT); var_dump($hash);Во время логина точно так же, выведите введенный пользователем пароль и полученный из БД хэш:
var_dump($password); var_dump($row['password']); if(password_verify($password, $row['password'])) ...
И просто глазами сравните с ранее сохраненными значениями.
- если пароли и хэши совпадают, это значит что
password_verify()вернет true - если
password_verify()возвращает false, это значит, что либо пароли, либо хэши при регистрации и при логине не совпадают. И вам надо разобраться - почему.