Итак, у меня есть страница регистрации и страница входа в систему, страница регистрации работает отлично, но страница входа не работает, и я не могу понять это.
Кажется, моя база данных работает, так как я могу вывести хешированный пароль на страницу входа в систему, похоже, это как-то связано с
password_verify ()
Страница регистрации (рабочая)
<?php
include("assets/includes/conn.php");
$user = $_POST['username'];
$pass = $_POST['pass'];
$cPass = $_POST['c-pass'];
$email = $_POST['email'];
$options = [
'cost' => 11
];
if($pass == $cPass){
$stmt = $conn->prepare("INSERT INTO users (username, pass, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $user, $h_p, $email);
$user = $_POST['username'];
$h_p = password_hash($pass, PASSWORD_DEFAULT, $options)."\n";
$email = $_POST['email'];
$stmt->execute();
echo "Created";
echo $h_p;
$stmt->close();
$conn->close();
}
Страница входа (не работает)
<?php
include("assets/includes/conn.php");
$username = $_POST['username'];
$password = $_POST['pass'];
$sql = "SELECT * FROM users WHERE username = '$username'";
$result = $conn->query($sql);
if ($result->num_rows == 1){
$row = $result->fetch_assoc();
$hash = $row['pass'];
if(password_verify($password, $hash)){
echo "Yes";
} else {
echo "No<br/>";
echo "" . $hash . "<br/>";
echo $password;
}
}
Проблема здесь в том, что \n
в:
$h_p = password_hash($pass, PASSWORD_DEFAULT, $options)."\n";
^^
является (невидимо) добавив возврат каретки / перевод строки в конце вашего пароля / хэша.
Вы можете удалить его.
$h_p = password_hash($pass, PASSWORD_DEFAULT, $options);
или же trim()
Это:
$h_p = password_hash($pass, PASSWORD_DEFAULT, $options)."\n";
$h_p = trim($h_p);
Я, честно говоря, не знаю, почему руководство по password_hash()
не упоминает об этом и об использовании его для хранения в базе данных (или файле).
НОТА: Что за документы не использовал здесь было назначать переменная к примеру, что было сделано в вопросе здесь. Некоторые могут подумать, что использование примера и присвоение ему переменной будет работать; это не будет; не для хранения хеша, а затем проверки его после.
Пример из руководства гласит:
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";
Но делать:
$var = password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";
будет на самом деле (теоретически) содержат строку длиной 61 (из-за объединенного символа перевода строки) вместо предполагаемых 60 без символа перевода строки.
Посмотри на этот пример кода песочницы
При запуске он выдаст что-то вроде этого:
$ 2y $ 10 $ 494GPYzaynEkfYxE3wcAj.OtwBU3CCwTMXOHKbdJmOqwMXRmq6v1u 61
На всякий случай, если URL-адрес будет 404 позже, вот код для выше:
<?php
$foo = password_hash('mypass', PASSWORD_DEFAULT)."\n";
echo $foo;
echo strlen($foo);
На добавленной заметке; Вы также должны использовать подготовленное заявление для вашего SELECT
так же, как вы сделали для INSERT
; это намного безопаснее.
Других решений пока нет …