У меня есть проблема с попыткой входа в систему с использованием сохраненного хэша из моей базы данных, я сохраняю свой пароль следующим образом, который отлично работает:
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
которая также учитывает неправильное значение, которое вставляется в базу данных. Все эти проблемы были связаны с проблемами.