Почему password_verify
возвращает false?
Этот вопрос задуман как канонический и был создан просто на основе количества вопросов, заданных по этой теме.
Почему password_verify
возвращает false?
Этот вопрос задуман как канонический и был создан просто на основе количества вопросов, заданных по этой теме.
Существует множество причин, по которым password_verify
может возвращать значение false. может варьироваться от настройки вашей таблицы до фактического сравнения пароля, ниже приведены распространенные причины сбоя.
Длина столбца пароля в вашей таблице слишком мала:
PASSWORD_DEFAULT
then it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice).PASSWORD_BCRYPT
, то рекомендуется сохранить результат в столбце базы данных, состоящем из 60 символов, потому что PASSWORD_BCRYPT
всегда приводит к строке из 60 символов или FALSE в случае ошибки.Другая распространенная причина — когда разработчики пытаются «очистить» пароль пользователя, чтобы он не был вредоносным, в результате это приводит к тому, что ввод отличается от того, что хранится в таблице. Даже не обязательно избегать ввода, вместо этого вы должны использовать подготовленные операторы. Вы не должны даже trim
пароли, так как это может изменить то, что было изначально предоставлено.
При использовании password_verify
вам нужно сравнить открытый текстовый пароль с хэшем из базы данных/файла/какого-то другого метода хранения, а не сравнивать хэши (подразумевается, что вам нужно сохранить хешированный пароль пользователя при регистрации ):
<?php
$hashed = password_hash('test', PASSWORD_DEFAULT);
$password = 'test';
if (password_verify($password, $hashed)) {
echo 'success';
} else {
echo 'fail';
}
?>
Убедитесь, что вы действительно передаете хеш в password_verify
, а не что-то еще, сбрасывая его.
Если вы используете жестко закодированный хэш и у вас возникают проблемы, убедитесь, что вы используете одинарные кавычки вместо двойных при сохранении значения в переменной, поскольку $
будет интерпретироваться при использовании двойных кавычек:
<?php
// Undefined variable: QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu :1
$incorrect = "$2y$10$QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu";
$correct = '$2y$10$QHpfI0MfQWjvsVQWRdFHSOX6WqG8LSf0iFGiKs0Fz0RvqhpFOpAKu';
?>
Repl – закомментировать соответственно.
var_dump()
хешированный пароль при регистрации прямо перед тем, как вы вставите его в вашей базе данных и var_dump()
снова после того, как вы извлечете ее из своей базы данных, когда вы собираетесь password_verify()
ее. Убедитесь, что оба хэша идентичны. Если это так, и пароли в открытом виде тоже идентичны, то нет никаких причин для сбоя password_verify
. Он терпит неудачу только в том случае, если хэш каким-либо образом изменяется при его обходе через базу данных или если пароли в открытом виде не идентичны.
Убедитесь, что вы передаете правильный алгоритм password_hash
со вторым параметром.
Согласно документации:
Внимание Настоятельно рекомендуется не создавать собственную соль для этой функции. Он автоматически создаст для вас безопасную соль, если вы ее не укажете.
Как отмечалось выше, предоставление параметра соли в PHP 7.0 будет генерировать предупреждение об устаревании. Поддержка предоставления соли вручную может быть удалена в будущем выпуске PHP.