password_verify () всегда возвращает false - PullRequest
0 голосов
/ 03 ноября 2018

Я использую password_verify с двумя аргументами: хеш-значение, которое хранится в базе данных, и действительный пароль, который вводит пользователь. Вот код:

$pass = filter_input(INPUT_GET, 'password', FILTER_DEFAULT);
// connecting to the database and executing query, the password is stored in $dpass

  if(password_verify($pass,$dpass))
     echo "Hello User " .  $dname;

else
  echo "Login incomplete";

Теперь просто для уточнения:

  • Password столбец в моей базе данных varchar(256)
  • Та же самая функция фильтрации, которая происходит во время входа, используется во время регистрации
  • Я пытался password_verify() мой пароль с тем же значением хеша, которое появилось при регистрации, без использования возвращаемого значения базы данных (эхо-хэш, копирование и вставка)
  • Я отображаю как хэш-значение, так и введенный пароль, оба они верны
  • Я пробовал оба BCRYPT и DEFAULT, и они оба не были проверены правильно

В чем может быть проблема?

1 Ответ

0 голосов
/ 03 ноября 2018

Спасибо всем за ваши ответы, после того, как я запустил свой echo $ pass через каждую строку, я заметил, что в какой-то момент кода он меняется с исходного значения на другое, я проверил его снова и, по-видимому, переменную $ pass используется в файле dbconnect.php, который включен в код, в котором есть настройки и настройки моей базы данных, он использует переменную $pass для хранения пароля базы данных, вот что изменило значение пароля, я исправил $ pass для $ usrPass и все работало нормально.

Так что для любого, кто столкнется с этой проблемой в будущем и увидит ее, вот наиболее распространенные ошибки, которые приводят к password_verify() неработоспособности:

  • использование двойных кавычек при хранении значения хеша ($hash = "$2$ds$fdajja..."; использование двойных кавычек заставляет PHP читать $2 $ds и $fdajja... как отдельные переменные, которые, вероятно, приведут к разрыву вашего кода, ИСПОЛЬЗУЙТЕ ОДИН КВОТЫ ВМЕСТО.
  • выводит как хэш, так и введенные значения и убедитесь, что они совпадают с теми, которые были вставлены и сгенерированы во время password_hash()
  • если значение базы данных было другим (хеш), убедитесь, что тип ее столбца равен varchar(256), хеш обычно имеет длину 60 символов, но функция хеширования часто улучшается, так что длина может увеличиться в будущем.
  • если введенное значение было другим (пароль пользователя), убедитесь, что фильтрация не портит значение пароля, а также проверьте, имеет ли другая переменная то же имя, что и та, в которой вы храните пароль в
  • Если password_verify ($ pass, password_hash ($ pass, PASSWORD_DEFAULT)) "работает", то проблема в том, что $ dpass не содержит того, что ожидается - в том числе не сгенерировано правильно (так, что оно содержит и почему это не так, как ожидалось?). Если это «не работает», то другая линия вызывает наблюдаемое поведение. Оба эти результата позволяют сосредоточиться на уточненном наборе проблем. Спасибо user2864740 за указание на это.

РЕДАКТИРОВАТЬ: Ребята, функция фильтра паролей вообще ничего не сделала, потому что нечего было фильтровать, для тех из вас, кто не знаком с ней, функция в основном работает с входными параметрами, она работает как с входами GET, так и с POST, так как я все еще делаю бэкэнд, я использую GET для тестирования.

...