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

无法登录管理面板:管理员/作者权限验证代码问题求助

问题分析与修复方案

嘿,我来帮你搞定这个登录权限控制的问题,你的代码里有几个关键问题需要修正,我一步步给你拆解:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:18:51