Stack Overflow на русском Asked by ARTISUC on November 10, 2021
Уважаемые любители и профессионалы, подскажите пожалуйста, где собака зарыта?
Есть обработчики регистрации и авторизации (в одном файле) и всё работает отлично кроме одного – пишет НЕ ВЕРНЫЙ ЛОГИН ИЛИ ПАРОЛЬ
Вот код:
//Регистрация пользователей
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, дело всё в ней я подозреваю.
Помогите пожалуйста решить вопрос, так как при хэшировании выдаёт НЕ ВЕРНЫЙ ЛОГИН ИЛИ ПАРОЛЬ
Функция 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, $pass);
$stmt->execute();
}
и тогда вы сможете использовать password_verify()
Answered by UKRman on November 10, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP