Системы безопасного входа в PHP, использующие схему шифрования паролей - PullRequest
0 голосов
/ 16 мая 2018

Я разрабатывал безопасную страницу входа для пользователей, но каким-то образом проверка пароля, похоже, не работает при входе в систему.

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

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

Ошибка всегда показывает, что пароль неправильный.

Страница входа:

<?php
/* User login process, checks if user exists and password is correct */

// Escape email to protect against SQL injections
$username = $mysqli->escape_string($_POST['username']);
$password = $mysqli->escape_string(password_hash($_POST['password'], PASSWORD_BCRYPT));
$result = $mysqli->query("SELECT * FROM `users` WHERE `username`='$username'");

if ( $result->num_rows == 0 ){ // User doesn't exist
    $_SESSION['message'] = "User with that username doesn't exist!";
    header("location: error.php");
}
else { // User exists
    $user = $result->fetch_assoc();

    if ( password_verify($_POST['password'], $user['password']) ) {

        $_SESSION['email'] = $user['email'];
        $_SESSION['first_name'] = $user['first_name'];
        $_SESSION['last_name'] = $user['last_name'];
        $_SESSION['username'] = $user['username'];
        $_SESSION['active'] = $user['active'];

        // This is how we'll know the user is logged in
        $_SESSION['logged_in'] = true;

        header("location: dashboard.html");
    }
    else {
        $_SESSION['message'] = "You have entered wrong password, try again!";
        header("location: error.php");
    }
}

Страница регистрации:

<?php
/* Registration process, inserts user info into the database 
   and sends account confirmation email message
 */

// Set session variables to be used on profile.php page
$_SESSION['email'] = $_POST['email'];
$_SESSION['first_name'] = $_POST['firstname'];
$_SESSION['last_name'] = $_POST['lastname'];

// Escape all $_POST variables to protect against SQL injections
$first_name = $mysqli->escape_string($_POST['firstname']);
$last_name = $mysqli->escape_string($_POST['lastname']);
$email = $mysqli->escape_string($_POST['email']);
$password = $mysqli->escape_string(password_hash($_POST['password'], PASSWORD_BCRYPT));
$hash = $mysqli->escape_string( md5( rand(0,1000) ) );

// Check if user with that email already exists
$result = $mysqli->query("SELECT * FROM users WHERE email='$email'") or die($mysqli->error());

// We know user email exists if the rows returned are more than 0
if ( $result->num_rows > 0 ) {

    $_SESSION['message'] = 'User with this email already exists!';
    header("location: error.php");

}
else { // Email doesn't already exist in a database, proceed...

    // active is 0 by DEFAULT (no need to include it here)
    $sql = "INSERT INTO users (first_name, last_name, email, password, hash, active) " 
            . "VALUES ('$first_name','$last_name','$email','$password', '$hash', 1)";

    // Add user to the database
    if ( $mysqli->query($sql) ){

        $_SESSION['active'] = 0; //0 until user activates their account with verify.php
        $_SESSION['logged_in'] = true; // So we know the user has logged in
        $_SESSION['message'] =

                 "Confirmation link has been sent to $email, please verify
                 your account by clicking on the link in the message!";

        header("location: profile.html"); 

    }
    else {
        $_SESSION['message'] = 'Registration failed!';
        header("location: error.php");
    }
}

Вот форма входа / регистрации, которую пользователь использует для входа в систему: "http://riselamagana.byethost4.com/projects/webdev3/production/index.php"

и база данных будет: таблица "пользователи"

Хэш пароля, сгенерированный для «password_28», был: «$ 2y $ 10 $ W3bOAG0BP / DExr / qpiT0ueVS3YHb2NVeSC3.oMAaVQbHlodJVudK.".

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

Любые дальнейшие предложения, несомненно, будут оценены.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вы сравниваете не с хешированным паролем, вы сравниваете необработанный почтовый пароль ...

// В своем коде, строка 6, вы хэшируете пароль

$password = $ mysqli-> escape_string (password_hash ($ _ POST ['password'], PASSWORD_BCRYPT));

// В строке 16 вы не

if (password_verify ($ _ POST ['пароль'], $ user ['password'])) {

// Попробуйте вместо этого ...

if (password_verify ($ password, $ user ['password']))) {

0 голосов
/ 12 октября 2018

Хэш пароля, сгенерированный для "password_28", был: "$ 2y $ 10 $ W3bOAG0BP / DExr / qpiT0ueVS3YHb2NVeSC3.oMAaVQbHlodJVudK.".

1005 1006 *1006* 1006 *1006* 1006 *1006*.

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

// ...
     $user = $result->fetch_assoc();
// ...
     if ( password_verify($_POST['password'], $user['password']) ) {
// ...

Возвращаются ли несколько строк для $result?Возможно ли, что вы сравниваете неправильный хеш в этом месте?

Чтобы устранить эту проблему, введите $_POST['password'] жестким кодом "password_28" и посмотрите, не сработает ли он по-прежнему.Затем отмените изменения и жестко закодируйте ваш хэш пароля.Это все еще не работает?

Если это происходит с первого раза, вы, вероятно, изменяете $_POST где-то еще в вашем приложении, и это приводит к сбою проверки.

Если это не удается во второмвремя, сначала проверьте, что вы получаете только одну строку назад (в противном случае, это тривиальное исправление: убедитесь, что вы используете правильный пароль hahs для правильного пользователя).Если это так, вы, вероятно, столкнулись с проблемой кодировки, связанной с хранением хэшей паролей.Слишком короткий столбец базы данных для хэша пароля?(Как правило, вы хотите varchar(255) или TEXT для MySQL, поскольку MySQL усекается по умолчанию, если вы не работаете в строгом режиме.)

Наконец, я бы рекомендовал без использования $mysqli->escape_string() и вместо этого принимает подготовленные заявления .Подготовленные операторы являются гораздо более надежной стратегией для предотвращения внедрения SQL-кода в программное обеспечение PHP, чем для экранирования.

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