首页 > 解决方案 > PDO 准备好的语句和密码散列?

问题描述

我查看了整个互联网以尝试解决这个问题,但我无法为我的生活找到答案。真的开始放弃了。

所以基本上每当我使用正确的电子邮件和正确的密码登录时,它都会显示错误的电子邮件或密码。这只发生在我在数据库中散列密码时

电子邮件:test@gmail.com

密码:testtest

哈希:$2y$10$hk3d/GyYvImcxYR.vdC2/.JDIeQeXyKdTSPifueAkQNrYVBcMn1Yi

无论如何,如果有人可以帮助我,那将是我的login.php代码。

<?php
    require "../private/php/autoload.php";
    $error = "";
    
    if($_SERVER['REQUEST_METHOD'] == "POST" && isset($_SESSION['token']) && isset($_POST['token']) && $_SESSION['token'] == $_POST['token']){
        $email = $_POST['email'];
        if(!preg_match("/^[\w\-]+@[\w\-]+.[\w\-]+$/", $email)){
            $error = "Please enter a valid email.";
        }
        
        $password = $_POST['password'];
        
        if ($error == ""){
            $arr['email'] = $email;
            $arr['password'] = $password;
            
            $query = "SELECT * FROM users WHERE email = :email && password = :password LIMIT 1";
            $stm = $conn->prepare($query);
            $check = $stm->execute($arr);
            
            if($check){
                $data = $stm->fetchAll(PDO::FETCH_OBJ);
                if(is_array($data) && count($data) > 0){
                    $data = $data[0];
                    if (password_verify($_POST['password'], $data->password)){
                    $_SESSION['username'] = $data->username;
                    $_SESSION['user_id'] = $data->user_id;
                    header("Location: index.php");
                    die;
                    }
                }
            }
        }
        $error = "Wrong email or password!";
    }
    $_SESSION['token'] = get_random_string(30);
?>```

标签: phppdohash

解决方案


您的 MySQL 表包含哈希密码,但您通过未哈希密码查询它,这就是它目前不匹配/工作的原因。

此外,值得注意的是,从安全的角度来看,这可能很糟糕,因为正在传输明文密码,并且很容易出现在您的 MySQL 日志中(慢日志、错误,如果有任何问题等)。

将查询换出以仅查找电子邮件地址(假设它是唯一的),然后验证您的 PHP 逻辑中的密码哈希是否与 MySQL 结果匹配。


推荐阅读