Как загрузить хешированный пароль в мою базу данных? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть базовая страница входа в систему c, которая использует этот код PHP для загрузки непосредственно в мою базу данных. Когда я использую этот код, он работает нормально и загружает все в мою таблицу:

    $fname = $_POST['fname'];
    $lname = $_POST['lname'];
    $Email = $_POST['Email'];
    $username = $_POST['username'];
    $password = ($_POST['password']);
    $PhoneNumber = ($_POST['PhoneNumber']);
    $query = $con-> prepare("
    INSERT INTO Users (fName, lName,Email, username, pass_word,PhoneNumber)
    VALUES (:fname, :lname, :Email, :username,:password, :PhoneNumber)

    ");
    $success = $query-> execute ([
        'fname' => $fname,
        'lname' => $lname,
        'Email' => $Email,
        'username' => $username,
        'password' => $password,
        'PhoneNumber' => $PhoneNumber
    ]);

Но когда я добавляю функцию пароля ha sh, он просто ничего не загружает в базу данных.

        $fname = $_POST['fname'];
        $lname = $_POST['lname'];
        $Email = $_POST['Email'];
        $username = $_POST['username'];         
        $password = ($_POST['password']);
        $PhoneNumber = ($_POST['PhoneNumber']);
        $hashed_password = password_hash($password, PASSWORD_DEFAULT);
        $query = $con-> prepare("
        INSERT INTO Users (fName, lName,Email, username, pass_word,PhoneNumber)
        VALUES (:fname, :lname, :Email, :username,:password, :PhoneNumber)

        ");
    $success = $query-> execute ([
            'fname' => $fname,
            'lname' => $lname,
            'Email' => $Email,
            'username' => $username,
            'password' => $hashed_password,
            'PhoneNumber' => $PhoneNumber
        ]);

Обновление: я внес изменения, которые были предложены, но у меня все еще остается та же проблема. Это мой обновленный код:

$password = $_POST['password'];


    $hashed_password = password_hash($_POST['password'], PASSWORD_BCRYPT, ['cost' => 15]);

    $query = $con-> prepare("
        INSERT INTO Users (fName, lName,Email, username, pass_word,PhoneNumber)
        VALUES (:fname, :lname, :Email, :username,:password, :PhoneNumber)

        ");
    $success = $query-> execute ([
            'fname' => $fname,
            'lname' => $lname,
            'Email' => $Email,
            'username' => $username,
            'password' => $hashed_password,
            'PhoneNumber' => $PhoneNumber
        ]);

1 Ответ

5 голосов
/ 30 марта 2020

1:

 $hashed_password = password_hash($hashed_password, PASSWORD_DEFAULT);

Вы хэшируете пустую строку.

Вы должны хешировать переменную, содержащую пароль:

 $hashed_password = password_hash($_POST['password'], PASSWORD_DEFAULT);

2:

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

VALUES (:fname, :lname, :Email, :username,$hashed_password, :PhoneNumber) 

Но у вас есть $hashed_password в качестве жестко закодированной переменной. Это неверно на уровне синтаксиса и приведет к SQL ошибкам, так как не заключено в кавычки .

Вам нужно установить это значение в ->execute, как вы делаете со всеми другие переменные:

    $query = $con-> prepare("
    INSERT INTO Users (fName, lName,Email, username, pass_word,PhoneNumber)
    VALUES (:fname, :lname, :Email, :username, :pwd, :PhoneNumber)

    ");
$success = $query-> execute ([
        'fname' => $fname,
        'lname' => $lname,
        'Email' => $Email,
        'username' => $username,
        'pwd' => $hashed_password,
        'PhoneNumber' => $PhoneNumber
    ]);

ЗАМЕЧАНИЯ ПО БЕЗОПАСНОСТИ:

A:

Вы не устанавливаете значение cost в PASSWORD_DEFAULT (во время написания это BCRYPT) механизм хеширования. STRONGLY ENCOURAGED , что вы устанавливаете это значение стоимости как можно выше, а не значение по умолчанию 10.

Я бы предложил установить значение стоимости на не менее 15 и чтение PHP Страницы руководства , где также указано, как найти идеальную стоимость вашего сервера,

 $hashed_password = password_hash($password, PASSWORD_BCRYPT, ['cost' => 15]);

B:

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

C:

Я также настоятельно рекомендую убедиться, что ваши MySQL сопоставления и наборы символов UTF8mb4_ имеют префикс Unicode: UTF8mb4_unicode_ci относительно вашего столбец / таблица для хранения пароля (также убедитесь, что ваш столбец достаточно длинный *).

* вот что она сказала!

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