无法登录管理面板:管理员/作者权限验证代码问题求助
问题分析与修复方案
嘿,我来帮你搞定这个登录权限控制的问题,你的代码里有几个关键问题需要修正,我一步步给你拆解:
1. SQL查询的逻辑错误
你写的SQL条件AND role = 'admin' OR 'writer'逻辑有问题,因为AND的优先级比OR高,实际执行的时候会变成:
SELECT * FROM `users` WHERE (`user_id` = '$_SESSION[id]' AND `role` = 'admin') OR 'writer'
这显然不是你要的效果——它会把所有符合user_id+admin的用户,加上永远为真的'writer'条件(非空字符串在SQL里会被视为true),导致所有用户都能通过验证。
正确的写法应该是用括号把OR的条件括起来,确保先判断角色是否是admin或writer:
SELECT * FROM `users` WHERE `user_id` = ? AND (`role` = 'admin' OR `role` = 'writer')
2. 严重的SQL注入风险
直接把$_SESSION['id']拼进SQL语句里是非常危险的,恶意用户可以通过构造session值来执行任意SQL语句,窃取或篡改你的数据。必须用**预编译语句(Prepared Statements)**来避免这个问题。
3. 跳转后未终止脚本执行
调用header("Location: ...")之后,一定要加上exit;或者die();,否则脚本会继续执行后面的代码,可能导致权限控制失效。
修正后的完整代码
<?php session_start(); include_once("../include/config.php"); // 检查session是否存在用户ID if(isset($_SESSION['id'])) { // 使用预编译语句避免SQL注入 $stmt = mysqli_prepare($conn, "SELECT * FROM `users` WHERE `user_id` = ? AND (`role` = 'admin' OR `role` = 'writer')"); mysqli_stmt_bind_param($stmt, "i", $_SESSION['id']); // 假设user_id是整数类型,用"i";如果是字符串用"s" mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 检查是否有匹配的记录 if(mysqli_num_rows($result) !== 1) { // 无权限,跳转到首页 header("Location: ../index.php"); exit; // 必须终止脚本 } // 有权限,继续执行后续代码 } else { // 未登录,跳转到首页 header("Location: ../index.php"); exit; } ?>
额外注意事项
- 确保
config.php里的数据库连接$conn是正确的,没有连接错误 - 检查数据库中
role字段的取值是否和你代码里的一致(比如是admin还是Admin,大小写要匹配) - 建议给
$_SESSION['id']做类型校验,比如确保它是整数(如果user_id是整数的话),避免非法值传入
内容的提问来源于stack exchange,提问作者Groza
相关产品推荐
相关产品推荐

