Intereting Posts

password_verify не возвращает true / false

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

adduser($conn, '3', $username, $password); 

Это вызывает следующую функцию:

  function adduser ($conn, $level, $username, $password) { $password = mysqli_real_escape_string($conn, $password); $password = mysqli_real_escape_string($conn, $username); $password = password_hash($password, PASSWORD_BCRYPT); $user = "INSERT INTO users (level, username, password) VALUES ('$level', '$username', '$password')"; mysqli_query($conn, $user) or die (mysqli_error($conn)); } 

Поле моего пароля – CHAR(60) поэтому сохраненный хэш пароля должен иметь нужный размер.

Когда я пытаюсь войти в систему, я вызываю эту функцию:

 if (login($conn, $username, $password) === true){ } 

Что существует здесь:

  function login ($conn, $username, $password) { $password = mysqli_real_escape_string($conn, $password); $username = mysqli_real_escape_string($conn, $username); $query = "SELECT password FROM `users` WHERE username='$username'"; $result = mysqli_query($conn, $query) or die(mysqli_error($conn)); $row = mysqli_fetch_array($result, MYSQLI_ASSOC); $hash = $row["password"]; $verify = password_verify($password, $hash); if ($verify) { return true; } else { return false; } } 

Моя проблема в том, что он никогда не возвращает true или false, что делает невозможным логин для входа …

Дополнительно: он успешно отправляется в базу данных

Я также попытался запустить это, которое успешно разместило данные из моей базы данных

 $query = "SELECT password FROM `users` WHERE username='$username'"; $result = mysqli_query($conn, $query) or die(mysqli_error($conn)); $row = mysqli_fetch_array($result, MYSQLI_ASSOC); echo $row["password"]; 

Обновить


Делая это:

 echo '<br/>'; echo $hash; echo '<br/>'; echo $password; 

Дает мне следующий результат:

 $2y$10$OfJhVve4GMZRfjfelb8sNOJ7EN5NAAGOmsN6OS/SC7PZGU5mDNOou hej 

Что соответствует паролю в моей базе данных

 $2y$10$OfJhVve4GMZRfjfelb8sNOJ7EN5NAAGOmsN6OS/SC7PZGU5mDNOou 

После тестирования всего кода я пришел к следующему выводу.

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

«Примечание: вам не следует избегать функции« пароль / хеш », пароли, такие как 123'\abc< являются абсолютно допустимыми и будут изменены при вставке».

 $password = mysqli_real_escape_string($conn, $username); 

Сторона примечания для ^ – Проконсультируйтесь с Редактированием № 2 ниже, рядом с «Однако …» :

Просто не используйте его, просто сохраните / используйте назначение в обычном режиме.

И password_hash() и password_verify() выполняют свою работу, поэтому нет необходимости скрывать пароли.

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

Эта функция экранирования, скорее всего, добавляет символ во время вставки.

Боковое примечание. Только для записи мой столбец пароля – VARCHAR , но это не будет отличием от вашего CHAR (Edit: consult footnote). Если тогда ALTER ваша колонка будет VARCHAR .

Однако руководство по password_hash() предполагает использование 255 для длины, что является хорошей ставкой.


Изменить сноску:

В соответствии с комментарием, который я опубликовал под моим ответом.

Это похоже на разницу. Это Q & A В чем разница между VARCHAR и CHAR? показывает это, согласно принятому ответу

VARCHAR – переменная длина.

CHAR – фиксированная длина.


Редактировать # 2:

После дальнейшего тестирования, чтобы увидеть, изменилось ли это с помощью ALTER'ing, столбец паролей от VARCHAR(255) до CHAR(60) сделал разницу; это не так.

Выполненные тесты:

  • Вставить новый хэш без функции экранирования и проверить: TRUE .
  • Вставка нового хеша с функцией экранирования и проверка: FALSE .

Поэтому и, как я сказал изначально; ошибка заключается в использовании mysqli_real_escape_string() .

Однако, перейдя через ваш код, эта строка:

 $password = mysqli_real_escape_string($conn, $username); 

Здесь вы использовали переменную $username которая также учитывает неправильное значение, которое вставляется в базу данных. Все эти проблемы были связаны с проблемами.