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; }; ?>
额外优化建议
- 密码无需使用
htmlspecialchars处理:哈希函数支持任意字符串,转义会改变原始密码的字符结构,导致哈希值和用户输入不匹配。 - 登录代码中
$email = $_POST['nom'];变量名混淆(nom是用户名,变量名却叫email),建议统一命名避免维护混乱。 - 确认数据库
password字段确实为VARCHAR(255):你当前var_dump显示哈希长度为60位,符合要求,不会被截断。
内容的提问来源于stack exchange,提问作者Gia
相关产品推荐
相关产品推荐

