Невозможно использовать password_verify ($ password, $ hash)

Итак, у меня есть страница регистрации и страница входа в систему, страница регистрации работает отлично, но страница входа не работает, и я не могу понять это.

Кажется, моя база данных работает, так как я могу вывести хешированный пароль на страницу входа в систему, похоже, это как-то связано с
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;

}
}

3

Решение

Проблема здесь в том, что \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; это намного безопаснее.

8

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector