Почему password_verify возвращает false?

Почему password_verify возвращает false?

Этот вопрос задуман как канонический и был создан просто на основе количества вопросов, заданных по этой теме.


person Script47    schedule 18.06.2018    source источник


Ответы (1)


Существует множество причин, по которым password_verify может возвращать значение false. может варьироваться от настройки вашей таблицы до фактического сравнения пароля, ниже приведены распространенные причины сбоя.

Настройка колонки

  • Длина столбца пароля в вашей таблице слишком мала:

    • If you are using 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.

person Script47    schedule 18.06.2018