Проверка пароля PHP всегда возвращает false

Я использую API хеширования паролей PHP для хеширования и проверки своих паролей на сайте, который я создаю, однако всякий раз, когда я пытаюсь проверить свой пароль, он всегда возвращает false.

У меня есть класс User, который устанавливает пароль до того, как они будут вставлены в базу данных:

public function set__password($passwd) {
    self::$password = password_hash($passwd, PASSWORD_BCRYPT, array('cost' => 12));
}

Если имя пользователя и адрес электронной почты уникальны, вставляется новая строка пользователя - после проверки моей базы данных у меня есть то, что кажется допустимой строкой BCRYPT для моего пароля:

$2y$12$lTMEP0wevDEMX0bzStzoyOEzOTIAi3Hyhd3nYjGwzbI

Чтобы проверить мой пароль, я запускаю следующий скрипт:

$username = $_POST['username'];
$password = $_POST['password'];

$DB = Database::getInstance();

// Get the stored password hash
$res = $DB->run__query('SELECT password FROM users WHERE username = "' . $username . '"');
$hash = $res[0]['password'];


// Do the passwords match?
if(password_verify($password, $hash)) {
    echo 'success';
} else {
    echo 'failed';
}

$hash относится к строке, приведенной выше, однако, когда я затем вызываю password_verify($password, $hash), где $password — это текстовый пароль, полученный из моего поля ввода, я всегда получаю значение false.


person Alex    schedule 14.07.2014    source источник
comment
Является ли $hash извлеченным из базы данных тем же самым значением, что и self::$password, помещенное в базу данных...? Типичная проблема: слишком короткие столбцы.   -  person deceze♦    schedule 14.07.2014
comment
PASSWORD_BCRYPT требует длины поля 60 из того, что я прочитал, я установил столбец в БД на это, поэтому я не думаю, что это должно быть проблемой - я еще раз проверю это, хотя   -  person Alex    schedule 14.07.2014
comment
Инъекционные уязвимости... $DB->run__query(). Конечно, он работает с таким именем пользователя, как bob, но не подходит для таких имен пользователей, как Bobby"; DROP TABLE users; --", не так ли?   -  person Elias Van Ootegem    schedule 14.07.2014
comment
@EliasVanOotegem хорошее место, я везде использовал блоки PDO - перепишу это   -  person Alex    schedule 14.07.2014
comment
Этот надоедливый Bobby Tables.   -  person Samsquanch    schedule 14.07.2014


Ответы (2)


В приведенном примере хеш-строки 50 символов вместо 60. Дважды проверьте базу данных — CHAR(60) — и var_dump($hash).

person Frank Liepert    schedule 14.07.2014
comment
Да, должно быть, я сделал опечатку, когда создавал таблицу, спасибо. - person Alex; 14.07.2014

Другая проблема, с которой вы можете столкнуться, заключается в том, что вы снижаете стоимость сервера, чтобы выиграть время.

Всегда используйте password_hash($pass, PASSWORD_DEFAULT), это лучший способ.

person albertto    schedule 09.07.2019
comment
В руководстве по PHP явно не рекомендуется использовать PASSWORD_DEFAULT, так как он может меняться со временем и версиями, что приводит к несогласованности. - person Cunning; 11.04.2020
comment
Пожалуйста, добавьте пояснение к своему ответу - звучит немного другая проблема, поскольку ваш ответ содержит решение проблемы, которая не была указана в вопросе? - person Nico Haase; 12.04.2020