TransWikia.com

Не работает password_verify() в PHP

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, дело всё в ней я подозреваю.

Помогите пожалуйста решить вопрос, так как при хэшировании выдаёт НЕ ВЕРНЫЙ ЛОГИН ИЛИ ПАРОЛЬ

One Answer

Функция 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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP