PHP登录系统password_hash验证失效问题求助
问题根源与解决方案
核心错误原因
- 密码验证逻辑错误:
password_hash()生成的哈希值包含随机盐,无法通过SQL的=直接匹配明文密码,必须用PHP内置的password_verify()函数验证。 - SQL注入风险:直接将用户输入的
$email、$password拼入SQL语句,存在严重安全漏洞。 - 第二种写法未做密码验证:仅查询邮箱存在性后直接放行,导致任意密码都能登录。
修正后的Login.php代码
<?php session_start(); // 假设$conn是已成功建立的数据库连接 if ($_SERVER["REQUEST_METHOD"] == "POST") { $email = trim($_POST['email']); $password = trim($_POST['password']); // 使用预处理语句查询用户信息(彻底规避SQL注入) $stmt = mysqli_prepare($conn, "SELECT id, password FROM users WHERE email = ?"); mysqli_stmt_bind_param($stmt, "s", $email); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if (mysqli_num_rows($result) === 1) { $user = mysqli_fetch_assoc($result); // 用password_verify验证明文密码与哈希值的匹配性 if (password_verify($password, $user['password'])) { $_SESSION['user_id'] = $user['id']; header("Location: dashboard.php"); // 替换为你的登录后跳转页面 exit(); } else { echo "密码不正确"; } } else { echo "该邮箱未注册"; } mysqli_stmt_close($stmt); mysqli_close($conn); } ?>
关键修正点说明
- 预处理语句防注入:通过参数绑定替代直接拼接变量,彻底避免SQL注入攻击。
- 正确的密码验证流程:先根据邮箱查询用户的哈希密码,再用
password_verify()完成明文与哈希的匹配验证。 - 严格结果判断:确保查询到且仅查询到一个用户后,再执行密码验证逻辑。
确认Registration.php的加密逻辑(确保正确)
注册时必须正确使用password_hash()生成哈希,示例代码如下:
<?php // 假设$conn是已成功建立的数据库连接 if ($_SERVER["REQUEST_METHOD"] == "POST") { $email = trim($_POST['email']); $password = trim($_POST['password']); // 生成密码哈希(默认使用bcrypt算法,自动生成随机盐) $hashed_password = password_hash($password, PASSWORD_DEFAULT); // 预处理语句插入数据 $stmt = mysqli_prepare($conn, "INSERT INTO users (email, password) VALUES (?, ?)"); mysqli_stmt_bind_param($stmt, "ss", $email, $hashed_password); if (mysqli_stmt_execute($stmt)) { echo "注册成功"; } else { echo "注册失败:" . mysqli_error($conn); } mysqli_stmt_close($stmt); mysqli_close($conn); } ?>
内容的提问来源于stack exchange,提问作者Dev.Fra
相关产品推荐
相关产品推荐

