Пароль всегда неверен при использовании password_verify с базой данных - PullRequest
0 голосов
/ 08 мая 2019

Я использую password_verify с базой данных, когда я вхожу в систему, всегда говорю неверный пароль, а в моей базе данных я использую char 255. Для пароля.

function login(){
    global $db, $username, $errors;

    // grap form values
    $username = e($_POST['username']);
    $password = e($_POST['password']);

     $userrecord1 = mysqli_query($db, "SELECT * FROM users WHERE username='$_POST[username]' LIMIT 1");

    if (count($userrecord1) == 1 ) {
        $urow1 = mysqli_fetch_array($userrecord1);
        $hash = $urow1["password"];
    }


    // attempt login if no errors on form
    if (count($errors) == 0) {

    $passuser = password_verify($password, $hash);

        $query = "SELECT * FROM users WHERE (username='$username' OR email='$username') AND password='$passuser' LIMIT 1";
        $results = mysqli_query($db, $query);

        if (mysqli_num_rows($results) == 1) { // user found
            // check if user is admin or user
            $logged_in_user = mysqli_fetch_assoc($results);
            if ($logged_in_user['user_type'] == 'admin') {

                $_SESSION['user'] = $logged_in_user;
                $_SESSION['success']  = "Welcome admin";
                header('location: /admin/home');          
            }else{
                $_SESSION['user'] = $logged_in_user;
                $_SESSION['success']  = "Welcome user";

                header('location: /home/index');
            }
        }else {
            array_push($errors, "Wrong username/password combination");
        }
    }
}

1 Ответ

0 голосов
/ 08 мая 2019

Есть несколько вещей, на которые я бы хотел обратить внимание:

  1. Использование ключевого слова global не рекомендуется - вместо этого вы должны передавать значения в качестве аргументов функции.
  2. Вы широко открыты для SQL-инъекций - используйте подготовленный оператор
  3. После того, как вы подтвердили пароль с помощью password_verify(), пароль правильный и пользователь подтвердил свой логин.
  4. if (count($userrecord1) == 1 ) { не имеет особого смысла, так как вы еще не получили ни одной записи.
  5. Ваш второй выбор является спорным (см. Пункт 3) и недействителен, поскольку выбор из хешированного пароля не даст результата.
  6. Использовать exit; после header("Location: .."); звонков
function login(){
    global $db, $username, $errors;

    // grap form values
    $username = e($_POST['username']);
    $password = e($_POST['password']);

    $stmt = $db->prepare("SELECT password, user_type FROM users WHERE username=? LIMIT 1");
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $stmt->bind_result($dbPassword, $userType);
    if ($stmt->fetch() && password_verify($password, $dbPassword)) {
        if ($userType == 'admin') {
            $_SESSION['user'] = $username;
            $_SESSION['success']  = "Welcome admin";
            header('location: /admin/home');     
            exit;     
        } else {
            $_SESSION['user'] = $username;
            $_SESSION['success']  = "Welcome user";
            header('location: /home/index');
            exit;
        }
    } else {
        $errors[] = "Wrong username/password combination";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...