password_verify 在真实密码上为假

password_verify is false on true password

我目前正在试验 password_hash() 和 password_verify() 方法..

所以我决定继续用它创造一点 login/register。

问题是每当我打开登录时输出是:

failed

我不知道为什么..我已经将我数据库中密码字段的长度设置为 255,但它仍然不起作用。

这是我的register.php:

<?php
require_once('db.php');

$username = mysqli_real_escape_string($db, $_GET['username']);
$password = mysqli_real_escape_string($db, $_GET['password']);

$p = password_hash($_GET['password'], PASSWORD_DEFAULT);

$stmt = $db->prepare("INSERT INTO users (username, password) VALUES (?,?)");
$stmt->bind_param('ss', $username, $p);

$stmt->execute();

$stmt->close();
$db->close();
?>

我的登录信息是这样的:

<?php
session_start();

error_reporting(0);

require_once('db.php');

function e($input) {
    return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}

$username = mysqli_real_escape_string($db, $_GET['username']);
$password = mysqli_real_escape_string($db, $_GET['password']);

$stmt = $db->prepare("SELECT username, password FROM users WHERE username = ?");
$stmt->bind_param('s', $username);

$stmt->execute();

$stmt->bind_result($username, $password);
$row = $stmt->fetch();

if (!empty($row)) { 
    if (password_verify($_GET['password'], $row['password'])) {
        echo 'success'; 
    } 
    else 
    {
        echo 'failed';
    }
} 
else 
{
    echo "This user does not exist"; 
}

$stmt->close();
$db->close();
?>

我不知道如何让它工作:/

$stmt->fetch();没有return数据。它将数据绑定到bind_result()中定义的变量。

所以在 $stmt->fetch() 之后,您将在 $username 中拥有用户名,在 $password 中拥有密码。

所以,真正应该比较的是:

if ($stmt->fetch()) {
    // here 
    if (password_verify($_GET['password'], $password)) {
        echo 'success'; 
    } 
    else 
    {
        echo 'failed';
    }
} 
else 
{
    echo "This user does not exist"; 
}