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

password_verify验证失败:输入密码与数据库哈希不匹配问题排查

password_verify验证失败问题排查与解决

核心问题:密码哈希时机错误

你的密码存储代码存在致命逻辑顺序错误——计算密码哈希的代码写在了获取用户提交密码的前面,导致哈希的是未定义的$arr['password'](而非用户实际输入的密码),数据库存储的哈希值和真实密码完全不匹配,自然验证失败。

错误代码片段:

// 此时$arr['password']还未从POST获取值,哈希的是空值/旧值
$password_hash= password_hash($arr['password'], PASSWORD_DEFAULT);
// 之后才给$arr['password']赋值
$arr['password']= htmlspecialchars( $_POST ['password']);

修正后的密码存储代码

将哈希计算逻辑移到获取所有POST参数之后:

<?php
//connessione bd
include 'conn.php';
include 'forminsertuser.php';

//recupero
if(!empty ($_POST["Submit1"])) 
{ 
    // 先获取用户提交的所有参数
    $arr['nom'] = htmlspecialchars($_POST ['nom']);
    $arr['password']= $_POST ['password']; // 密码无需html转义,保留原始值
    $arr['rankid']=  $_POST ['rankid'];
    
    // 基于真实密码计算哈希
    $password_hash= password_hash($arr['password'], PASSWORD_DEFAULT);

    $sql = 'INSERT INTO users ( nom, password, rankid) VALUES( :nom, :password, :rankid)';
    $statement = $conn->prepare($sql);
    $statement->execute([
        ':nom' => $arr['nom'],
        ':password' => $password_hash,
        ':rankid' => $arr['rankid'],
    ]);

    header("Location: process.php");
    exit;
};
?>

额外优化建议

  1. 密码无需使用htmlspecialchars处理:哈希函数支持任意字符串,转义会改变原始密码的字符结构,导致哈希值和用户输入不匹配。
  2. 登录代码中$email = $_POST['nom'];变量名混淆(nom是用户名,变量名却叫email),建议统一命名避免维护混乱。
  3. 确认数据库password字段确实为VARCHAR(255):你当前var_dump显示哈希长度为60位,符合要求,不会被截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:45:47