【问题标题】:Password always wrong using password_verify with database在数据库中使用 password_verify 时密码总是错误的
【发布时间】:2019-05-08 06:44:46
【问题描述】:

我在登录时使用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");
        }
    }
}

【问题讨论】:

  • 一旦你完成了你的第一次选择并找回了用户密码,你只需要测试password_verify()的结果——如果这是真的那么用户密码是正确的。第二个 SQL 没有意义。
  • 您的代码对SQL injection开放

标签: php database mysqli


【解决方案1】:

有几点我想说明,

  1. 不建议使用 global 关键字 - 您应该改为将值作为参数传递给函数。
  2. 您对 SQL 注入持开放态度 - 使用准备好的语句
  3. 通过password_verify() 验证密码后,密码正确且用户已验证登录。
  4. if (count($userrecord1) == 1 ) { 没有多大意义,因为您还没有获取任何记录。
  5. 您的第二个选择没有实际意义(请参见第 3 点),因为从散列密码中选择无效,因此不会产生结果。
  6. header("Location: .."); 调用后使用exit;
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";
    }
}

【讨论】:

    猜你喜欢
    • 2020-08-02
    • 2015-12-01
    • 2023-03-18
    • 2017-11-02
    • 1970-01-01
    • 2019-03-14
    • 2018-03-02
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多