Как получить пароль из базы данных с помощью password verify ()?
Я изучаю PHP и в качестве проекта начал строить социальную сеть. Я создал форму регистрации и форму входа в систему, и я могу добавлять пользователей в свою базу данных. Я также хэш-паролей. Это простой сайт и работа в процессе, так что есть много дыр в безопасности.
Моя проблема с файлом входа в систему, я не могу сопоставить пользователя с паролем, который он мне дал. Для проверки пароля пользователя я использую функцию password_verify()
, но она, похоже, работает неправильно.
Здесь это мой код:
Зарегистрируйтесь
<?php
//signUp.php
//Here is where I add a user in my database
//I validate the input, confirm that the password is written like it should be
//check if a user with the same username exists in the database
//if all checks out I will add the user in the database
//and redirect the user to his profile
require_once 'login.php';
require_once 'helperFunctions.php';
$conn = new mysqli($servername, $username, $password, $database);
if(!$conn)
die("Connection failed:" . mysqli_connect_error());
$myUsername = $_POST['Name'];
$myPassword = $_POST['Password'];
$myConfirm = $_POST['conPass'];
sanitize($conn, $myUsername);
sanitize($conn, $myPassword);
//check if the two passwords are the same
if($myPassword != $myConfirm){
print "Your passwords don't match";
header("refresh: 5; index.html");
} else {
//check if username already exists in database
$query = "SELECT * FROM members WHERE Username='$myUsername'";
$result = mysqli_query($conn, $query);
$count = mysqli_num_rows($result);
if($count == 0){
//hash password
$hashedPass = password_hash("$myPassword", PASSWORD_DEFAULT);
//username doesn't exist in database
//add user with the hashed password
$query ="INSERT INTO members (Username, Password) VALUES ('{$myUsername}', '{$hashedPass}')";
$result = mysqli_query($conn, $query);
if(!$result)
die("Invalid query: " . mysqli_error());
else{
print "You are now a member or The Social Network";
header("refresh: 5; login_success.php");
}
} else {
print "Username already exists";
header("refresh: 5; index.html");
}
}
?>
Login
<?php
//checkLogin.php
//Here is where I authenticate my users and if successfull I will show them their profile
require_once 'login.php';
require_once 'helperFunctions.php';
$conn = new mysqli($servername, $username, $password, $database);
if(!$conn)
die("Connection failed:" . mysqli_connect_error());
//Values from form
$myUsername = $_POST['Name'];
$myPassword = $_POST['Password'];
//sanitize input
sanitize($conn, $myUsername);
sanitize($conn, $myPassword);
$query = "SELECT * FROM members WHERE Username='$myUsername'";
$result = mysqli_query($conn, $query);
$count = mysqli_num_rows($result);
if($count == 1){
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
print "hashedPass = ${row['Password']}";
print "myPassword: " . $myPassword;
if(password_verify($myPassword, $row['Password'])){
print "Password match";
} else
print "The username or password do not match";
}
?>
Функция дезинфекции
function sanitize($conn, $val){
$val = stripslashes($val);
$val = mysqli_real_escape_string($conn, $val);
}
При запуске программы print "hashedPass = ${row['Password']}";
выводится хэшированный пароль, который совпадает с тем, который у меня есть в базе данных, но по какой-то причине я перенаправляюсь на оператор print "The username or password do not match";
после этого.
1 ответ:
Комментарий извлечен и взят из удаленного ответа:
"я вспомнил, что когда я впервые создал базу данных, я использовал CHAR(10) для паролей, в то время как хэшированный пароль требует больше символов."
Таким образом, всемогущий ответ здесь заключается в том, что ваш столбец пароля короче на 50 символов.
Password_hash () создает строку из 60 символов.
Руководство утверждает, что лучше всего использовать VARCHAR и с длиной 255 для того, чтобы приспособить для будущего изменения.
Решение этой проблемы сейчас заключается в том, чтобы начать сначала с новой регистрации, а затем снова войти в систему, используя то, что вы используете в настоящее время.
Пример из руководства:
<?php /** * We just want to hash our password using the current DEFAULT algorithm. * This is presently BCRYPT, and will produce a 60 character result. * * Beware that DEFAULT may change over time, so you would want to prepare * By allowing your storage to expand past 60 characters (255 would be good) */ echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n"; ?>
Приведенный выше пример выведет нечто подобное:
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3jq7kned1rvagv3fykk1a
Также из руководства:
Осторожно Использование PASSWORD_BCRYPT для параметра algo приведет к тому, что параметр password будет усечен до максимальной длины 72 символов.
PASSWORD_DEFAULT - используйте алгоритм bcrypt (по умолчанию с PHP 5.5.0). Обратите внимание, что эта константа предназначена для изменения с течением времени по мере добавления новых и более сильных алгоритмов в PHP. По этой причине длина результата от использования этого идентификатора может изменяться с течением времени. Поэтому рекомендуется хранить результат в столбце базы данных это может расширяться за пределы 60 символов (255 символов были бы хорошим выбором).
PASSWORD_BCRYPT - используйте алгоритм CRYPT_BLOWFISH для создания хэша. Это приведет к созданию стандартного крипто-совместимого хэша с использованием идентификатора " $2y$". Результат всегда будет 60 символьную строку, или false в случае возникновения ошибки.
Поддерживаемые Опции:Еще один комментарий / вопрос, извлеченный из удаленного ответа:
"Могу ли я изменить свое поле пароля без нужно удалить мою таблицу и начать с самого начала?"
Ответ-да. Смотрите этот вопрос и ответ на стеке:
Вы также можете проконсультироваться:
Sidenote: вам все равно потребуется повторно ввести новые хэши для (старых) затронутых столбцов.
Плюс, как уже говорилось; Вы открыты для SQL инъекция. Используйте подготовленное утверждение: