出于某种原因,无论如何,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的结果如下
脚本输出
答案 0 :(得分:1)
检查是否
$dbHandle -> sanitize($_POST['password']);
和
$password = $_POST['password'];
trim($password);
为您的密码生成完全相同的内容。
如果不是:那就是你面临的问题。与PDO无关,您可能在存储哈希值之前删除了密码...
如果是:如果您使用正确的密码,代码不应该失败。
答案 1 :(得分:0)
因为事实证明我在调用密码时正在调用mysqli_real_escape_string($PASSWORD, $dbHandle)
。当然,这完全改变了哈希值。
我通过在切换到PDO后将密码哈希重新插入数据库来解决这个问题。
这不是PDO错误。