Зарегистрируйтесь / Войдите, используя хэш пароля, затем подтвердите пароль - PullRequest
0 голосов

Я создаю функцию PHP для создаваемой страницы, где я регистрирую пользователей и хеширую их пароли в базе данных MYSql, называемой пользователями. Часть регистрации работает нормально, и я вижу, что пользователь создается и его пароли хэшируются, но когда я пытаюсь использовать Login.php и тот же пароль, который я сохранил, он не работает. Вот мой код, который я поместил в свой function.php:

// REGISTER USER
if (isset($_POST['reg_user'])) {
    // receive all input values from the form
    $username = esc($_POST['username']);
    $password_1 = esc($_POST['password_1']);
    $password_2 = esc($_POST['password_2']);

    // form validation: ensure that the form is correctly filled
    if (empty($username)) {  array_push($errors, "Uhmm...We gonna need your username"); }

    if (empty($password_1)) { array_push($errors, "uh-oh you forgot the password"); }
    if ($password_1 != $password_2) { array_push($errors, "The two passwords do not match");}

    // Ensure that no user is registered twice.
    // the email and usernames should be unique
    $user_check_query = "SELECT * FROM users WHERE username='$username' LIMIT 1";

    $result = mysqli_query($conn, $user_check_query);
    $user = mysqli_fetch_assoc($result);

    if ($user) { // if user exists
        if ($user['username'] === $username) {
            array_push($errors, "Username already exists");
        }
    }

    // register user if there are no errors in the form
    if (count($errors) == 0) {
        $password =  password_hash($password_1, PASSWORD_DEFAULT);//encrypt the password before saving in the database
        $user_dir = $_POST['username'];
        $query = "INSERT INTO users (username, password, user_dir, status, admin)
                      VALUES('$username', '$password', '$user_dir', 'OPEN', 'N')";
        mysqli_query($conn, $query);

        // get id of created user
        $reg_user_id = mysqli_insert_id($conn);

        // put logged in user into session array
        $_SESSION['user'] = getUserById($reg_user_id);

        // if user is admin, redirect to admin area
        if ( in_array($_SESSION['user']['admin'], ["Y", "N"])) {
            $_SESSION['message'] = "You are now logged in";
            // redirect to admin area
            header('location: ' . BASE_URL . 'admin/dashboard.php');
           // exit(0);
        } else {
            $_SESSION['message'] = "You are now logged in";
            // redirect to public area
          //  header('location: index.php');
            exit(0);
        }
    }
}

Это прекрасно работает, часть, которая не работает, это функция входа в систему для моего login.php:

// LOG USER IN
if (isset($_POST['login_btn'])) {
    $username = esc($_POST['username']);
    $password = esc($_POST['password']);

    if (empty($username)) { array_push($errors, "Username required"); }
    if (empty($password)) { array_push($errors, "Password required"); }
    if (empty($errors)) {


 Here is the problem--> $password =  password_hash($password, PASSWORD_DEFAULT); // encrypt password

        $sql = "SELECT * FROM users WHERE username='$username' and password='$password' LIMIT 1";

        $result = mysqli_query($conn, $sql);
        if (mysqli_num_rows($result) > 0) {
            // get id of created user
            $reg_user_id = mysqli_fetch_assoc($result)['id'];

            // put logged in user into session array
            $_SESSION['user'] = getUserById($reg_user_id);

            // if user is admin, redirect to admin area
            if ( in_array($_SESSION['user']['admin'], ["Y", "N"])) {
                $_SESSION['message'] = "You are now logged in";
                // redirect to admin area
              //  header('location: ' . BASE_URL . '/admin/dashboard.php');
                exit(0);
            } else {
                $_SESSION['message'] = "You are now logged in";
                // redirect to public area
              //  header('location: index.php');
                exit(0);
            }
        } else {
            array_push($errors, 'Wrong credentials');
        }
    }
}

Я предполагаю, что моя проблема, безусловно, это:

 $password =  password_hash($password, PASSWORD_DEFAULT); // encrypt password

и я попытался заменить его на

$password = password_verify($password, mysqli_num_rows($result);

ничего не происходит, но я знаю, что 2 часть функции password_verify сопоставляет $ password с тем, где она находится в таблице, которую я предполагаю, является строкой (следовательно, пытаюсь использовать num_rows).

любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Во-первых, я бы проверил, что весь хэш был правильно сохранен в MySQL. Официальная документация password_hash() рекомендует varchar(255). В большинстве случаев MySQL не будет жаловаться, если вы попытаетесь INSERT строка хеша, которая больше, чем размер столбца. Он просто выполнит тихое усечение и продолжит работу с INSERT.

Если ваш хэш-пароль был вставлен правильно, то ваш исходный код, содержащий запрос SQL:

SELECT * FROM users WHERE username='$username' and password='$password' LIMIT 1

должно работать.

0 голосов
/ 03 мая 2018

Добавлено password_verify() для подтверждения входа вместо просто sql.

Обновленный код:

<?php

if (isset($_POST['login_btn'])) {
    $username = esc($_POST['username']);
    $password = esc($_POST['password']);

    if (empty($username)) { array_push($errors, "Username required"); }
    if (empty($password)) { array_push($errors, "Password required"); }
    if (empty($errors)) {


        $sql = "SELECT * FROM users WHERE username='$username' LIMIT 1";

        $result = mysqli_query($conn, $sql);
        $row = mysqli_fetch_assoc($result);

        if (password_verify($password, $row['password'])) {
            // get id of created user
            $reg_user_id = $row['id'];

            // put logged in user into session array
            $_SESSION['user'] = getUserById($reg_user_id);

            // if user is admin, redirect to admin area
            if ( in_array($_SESSION['user']['admin'], ["Y", "N"])) {
                $_SESSION['message'] = "You are now logged in";
                // redirect to admin area
              //  header('location: ' . BASE_URL . '/admin/dashboard.php');
                exit(0);
            } else {
                $_SESSION['message'] = "You are now logged in";
                // redirect to public area
              //  header('location: index.php');
                exit(0);
            }
        } else {
            array_push($errors, 'Wrong credentials');
        }
    }
}

?>
...