切换到PDO后,Password_Verify始终返回false?

时间:2016-05-06 19:52:01

标签: php mysql html5 pdo

出于某种原因,无论如何,Password_Verify都返回false。我在从数据库返回的哈希上做了一个var_dump,它是正确的(60个字符)。我知道我输入的密码是正确的。我知道这个确切的方法在我切换到PDO之前就已经找到了(从我读到的,PDO更安全。另外,我喜欢使用参数化查询的想法)。

你可以看到我的旧代码正在运行(它被注释掉了)。 PDO返回的哈希有什么不同?

<?php
    /* When we have all of the input, try to login */
    if(isset($_POST['id']) && isset($_POST['password'])){

        /* Connect to the database */
        //$dbHandle = new Database();
        //$dbHandle -> connect();

        /* Santitize input to prevent SQL Injection */
        //$password = $dbHandle -> sanitize($_POST['password']);
        //$id       = $dbHandle -> sanitize($_POST['id']);

        $password = $_POST['password'];
        $id = $_POST['id'];

        trim($password);
        trim($id);

        // Query the Database for the users info
        $stmt = $dbHandle -> prepare("SELECT `password`, `admin`, `firstname`, `lastname` FROM users WHERE `id` = :id");
        $stmt -> bindParam(":id", $id, PDO::PARAM_INT);
        $stmt -> execute();
        $result = $stmt -> fetch(PDO::FETCH_ASSOC);

        //$result  = $dbHandle -> query("SELECT `password`, `admin`, `firstname`, `lastname` FROM users WHERE `id`=$id") -> fetch_assoc();
        $hash    = $result['password'];

        echo($hash . "<br>");
        echo(var_dump($hash));
        echo($password);
        echo(var_dump(password_verify($password, $hash)));
        /* Check to see if the user entered the correct password */
        if(password_verify($password, $hash)){

            //Login
            $_SESSION['loggedin'] = true;
            $_SESSION['admin']    = $result['admin'];
            $_SESSION['name']     = $result['firstname'] . ' ' . $result['lastname'];

            /* Update "lastlogin" 
            ** Remember that SQL expects datetime's to be inside single quotes (to make it a string)
            */
            $timestamp = date("Y-m-d h:i:s");
            $dbHandle -> query("UPDATE `users` SET `lastlogin`='$timestamp' WHERE `id`=$id");

            //Send user to home page
            header('Location: home.php');

        } else {
            echo("
                <p style='color:red;'>Wrong ID/Password</p>
            ");
        }
    }
?>

所有这些回声和vardump的结果如下

脚本输出

enter image description here

2 个答案:

答案 0 :(得分:1)

检查是否

$dbHandle -> sanitize($_POST['password']);

$password = $_POST['password'];       
trim($password);

为您的密码生成完全相同的内容。

如果不是:那就是你面临的问题。与PDO无关,您可能在存储哈希值之前删除了密码...

如果是:如果您使用正确的密码,代码不应该失败。

答案 1 :(得分:0)

因为事实证明我在调用密码时正在调用mysqli_real_escape_string($PASSWORD, $dbHandle)。当然,这完全改变了哈希值。

我通过在切换到PDO后将密码哈希重新插入数据库来解决这个问题。

这不是PDO错误。