注册哈希密码无法在登录时验证的问题求助
问题分析
你的核心问题是密码验证逻辑错误:
- 注册时用
password_hash()生成带随机盐的哈希值存储,这个函数每次生成的哈希字符串都不一样(因为内置随机盐); - 原登录代码直接拿用户输入的明文密码和数据库哈希对比,自然不匹配;
- 你尝试重新哈希用户输入的密码再查询,但由于每次哈希结果不同,也无法和数据库中已存储的哈希匹配。
正确解决方案
正确的验证流程应该是:
- 先根据用户输入的邮箱,从数据库查询出对应的用户信息(包括存储的密码哈希);
- 用PHP内置的
password_verify()函数对比用户输入的明文密码和数据库哈希值,这个函数会自动解析哈希中的盐,完成密码验证。
修改后的登录代码如下:
<?php session_start(); require 'dbcon.php'; if($_SERVER['REQUEST_METHOD'] == 'POST') { $email = $_POST['email']; $password = $_POST['password']; $remember = $_POST['remember'] ?? null; // 第一步:先根据邮箱查询匹配的用户 $query = "SELECT * FROM users WHERE email = '$email' limit 1"; $row = query($query); if($row) { $user = $row[0]; // 第二步:用password_verify验证密码正确性 if(password_verify($password, $user['password'])){ $_SESSION['SES'] = $user; if($remember) { $expires = time() + ((60*60*24)*7); $salt = "*&salt#@"; $tokenkey = hash('sha256', (time() . $salt)); $tokenvalue = hash('sha256', ('Logged_in' . $salt)); setcookie('SES', $tokenkey.':'.$tokenvalue, $expires); $id = $user['id']; $query = "UPDATE users SET tokenkey = '$tokenkey', tokenvalue = '$tokenvalue' WHERE id = '$id' limit 1"; query($query); } header("Location: index.php"); die; } } // 邮箱不存在或密码错误,统一提示 echo '<script> window.location.href="login.php"; alert("Email or password incorrect"); </script>'; } ?>
额外安全优化建议
- 修复SQL注入风险:当前用
addslashes()拼接SQL的方式存在漏洞,建议改用MySQLi或PDO的预处理语句; - 移除无用代码:原登录代码中
password_hash((time() . $salt),PASSWORD_DEFAULT);这行没有赋值给变量,完全无用,可直接删除; - 注册代码同样建议改用预处理语句,避免注入风险。
内容的提问来源于stack exchange,提问作者CarpeCodice
相关产品推荐
相关产品推荐

