Kenjiro Aikawa Ответов: 2

Проблема входа в систему с хэш-паролем с использованием PHP, mysql и PDO для доступа к базе данных.


Привет!

Я создал форму входа в систему с хешированием, но когда я пытаюсь войти в систему, она всегда возвращает true, даже если я ввел неправильный пароль. Ниже приведен мой код.

<?php
session_start();
include("../config/db_connection.php");

$un=$_POST['username'];
$pw=$_POST['password'];
$password_hash=password_hash($pw, PASSWORD_BCRYPT);

$stmt = $db->prepare("SELECT password from sys_user WHERE username=? AND password=?");
$stmt->execute(array($un, $pw));
$row_count = $stmt->rowCount();

if (password_verify($pw, $password_hash)) {
    $_SESSION["username"]=$un;
    echo "Correct";
}
else {
    echo "user: " . $un. "<br>";
    echo "pass: " . $password_hash. "<br>";
    echo "Wrong Username or Password";
}
?>


Пожалуйста, помогите мне. Заранее спасибо.

Что я уже пробовал:

Много манипуляций с моим кодом.

Mohibur Rashid

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

Kenjiro Aikawa

Привет, сэр, Ниже приведен мой код для регистрации учетной записи.

Kenjiro Aikawa

Привет, я уже решил свою проблему. Большое вам спасибо за ваши предложения.

2 Ответов

Рейтинг:
19

Richard Deeming

Посмотрите на документацию для password_verify функция:
РНР: функцию password_verify[^]

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

Вы передаете введенный пароль и вычисленный хэш введенного пароля Вы полностью игнорируете сохраненный хэш исходного пароля.

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

Считывание записи пользователя из базы данных на основе введенного имени пользователя. Прочтите значение параметра password столбец из записи базы данных. Передайте это значение в качестве второго аргумента password_verify функция.


Кроме того, ваш регистрационный код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]
PHP: SQL-инъекция - руководство пользователя[^]
РНР: Подготовленные инструкции и хранимые процедуры - руководство пользователя[^]


Kenjiro Aikawa

Привет, я уже решил свою проблему. Большое вам спасибо за ваши предложения.

Рейтинг:
0

Kenjiro Aikawa

<?php
include_once("../config/db_connection.php");

        $password_hash = password_hash($_POST['password'], PASSWORD_BCRYPT);
        $sql = "INSERT INTO sys_user (username, password, account_type)
         
        VALUES ('".$_POST["username"]."', '$password_hash', '".$_POST["accounttype"]."')";
        ($db->query($sql));
        header("Location: user_account.php?msg=correct");
?>


Richard Deeming

НЕ оставляйте комментарии с помощью кнопки "Добавить свой РЕШЕНИЕ вот" шкатулка!

Kenjiro Aikawa

Большое вам спасибо за ваш ответ, сэр. Я проверю свой код.

Kenjiro Aikawa

Привет, я уже решил свою проблему. Большое вам спасибо за ваши предложения.