You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用正确凭证时password_verify()返回false的排查求助

问题排查与修复方案

从你的代码和测试输出来看,存在几个明显的问题导致password_verify()返回false,下面逐个拆解分析:

1. 错误地对密码使用mysqli_real_escape_string()处理

不管是注册还是登录流程,你都对用户输入的原始密码调用了mysqli_real_escape_string(),这完全是画蛇添足还会搞砸验证:

  • 注册时,你实际哈希的是转义后的密码,不是用户真实输入的内容。比如用户密码里有'这类字符,转义后会变成\',导致哈希值和用户输入的原始密码不匹配。
  • 登录时,你传给password_verify()的是转义后的密码,自然和数据库里存储的转义后哈希也对不上(哦不对,其实是和用户真实输入的密码对不上,逻辑全乱了)。

修复方法:
直接移除注册和登录代码中对密码的转义处理,用原始输入值即可:

  • 注册代码修改:
// 删掉这两行转义
// $password = mysqli_real_escape_string ( $con, $_POST['password']);
// $password2 = mysqli_real_escape_string ( $con, $_POST['password2']);
$password = $_POST['password'];
$password2 = $_POST['password2'];
  • 登录代码修改:
// 删掉这行转义
// $password = mysqli_real_escape_string ( $con, $_POST['password']);
$password = $_POST['password'];

2. 数据库password字段长度不够

看你的测试输出,数据库里取出的哈希是$2y$10$uuQshjMaeepm6aY8.4lBne88tFo5oKem54wztm.dLXT——这明显是被截断了!正常的PASSWORD_DEFAULT生成的哈希是60个字符,如果你的users表中password字段长度小于60(比如设成VARCHAR(50)),就会把哈希砍断,直接导致验证失败。

修复方法:
修改数据库表结构,把password字段设成VARCHAR(255)(足够容纳所有哈希算法的结果,留足余量):

ALTER TABLE users MODIFY COLUMN password VARCHAR(255) NOT NULL;

注意:改完之后得重新注册测试用户,之前被截断的哈希已经没法用了。

3. 登录查询没处理用户名不存在的情况

你的登录代码直接链式调用->fetch_object()->password,如果查不到对应用户名的记录,fetch_object()会返回null,再调用->password直接就会抛出致命错误,脚本直接崩了。

修复方法:
先判断查询结果是否存在,再去拿哈希值:

$result = $con->query("SELECT password FROM users WHERE username = '$username'");
if ($result && $result->num_rows > 0) {
    $hash = $result->fetch_object()->password;
    // 后续验证逻辑
} else {
    // 用户名不存在的处理逻辑
    header("Location: ../index.php?1");
    die();
}

4. 登录代码有SQL注入风险

虽然你对$username做了转义,但直接把变量拼进SQL语句里还是不安全,推荐用预处理语句彻底避免注入:

$stmt = $con->prepare("SELECT password FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
    $hash = $result->fetch_object()->password;
    // 验证逻辑
}

按上面的步骤修复后,重新注册用户测试登录,应该就能正常通过password_verify()验证了。

内容的提问来源于stack exchange,提问作者Dennis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:09:55