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

原生PHP项目:实现普通用户无法访问admin目录的权限控制需求

嘿,我刚好在原生PHP项目里处理过几乎一模一样的权限控制需求,给你几个实战验证过的解决方案,按需选用:

方案1:目录级统一PHP会话验证(最简单直接)

这个方案的核心是给admin目录添加一个通用的权限验证脚本,让所有admin下的PHP文件都强制先验证用户角色。

步骤1:创建admin目录的权限验证脚本

在admin目录下新建auth.php,写入以下代码:

<?php
// 启动会话(确保整个应用的登录逻辑已经用session存储用户角色)
session_start();

// 双重验证:用户已登录 + 角色为管理员
if (!isset($_SESSION['user_id']) || !isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {
    // 未授权时跳转到登录页,或者直接返回403禁止访问
    header("HTTP/1.1 403 Forbidden");
    echo "您没有权限访问此页面";
    exit;
}
?>

步骤2:让所有admin文件自动加载验证脚本

两种方式任选:

  • 手动引入:在每个admin目录下的PHP文件开头添加require_once 'auth.php';
  • 自动加载(推荐):在admin目录下新建.htaccess文件,写入以下内容,让服务器自动在每个PHP文件执行前加载auth.php:
php_value auto_prepend_file "auth.php"

方案2:.htaccess + PHP拦截所有请求(适合不想修改现有文件的场景)

如果你的admin目录已经有很多文件,不想逐个修改,可以用URL重写把所有请求转发到一个验证脚本,通过后再放行。

步骤1:配置admin目录的.htaccess

在admin目录下新建.htaccess:

RewriteEngine On
# 排除验证脚本本身,避免循环请求
RewriteCond %{REQUEST_URI} !/admin/auth_check.php$
# 将所有PHP请求转发到auth_check.php
RewriteRule ^(.*\.php)$ auth_check.php?target=$1 [L]

# 如果需要限制静态文件(如CSS/JS),可以添加以下规则
# RewriteCond %{REQUEST_URI} !/admin/auth_check.php$
# RewriteRule ^(.*)$ auth_check.php?target=$1 [L]

步骤2:编写验证脚本auth_check.php

在admin目录下新建auth_check.php:

<?php
session_start();

// 权限验证逻辑和方案1一致
if (!isset($_SESSION['user_id']) || !isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {
    header("HTTP/1.1 403 Forbidden");
    echo "您没有权限访问此页面";
    exit;
}

// 安全检查:防止路径遍历攻击
$targetFile = $_GET['target'] ?? '';
if (strpos($targetFile, '..') !== false || !file_exists($targetFile)) {
    header("HTTP/1.1 404 Not Found");
    exit;
}

// 权限通过,加载目标文件
require_once $targetFile;
?>

方案3:统一入口架构(长期维护推荐)

如果你的项目还在初期,推荐重构为单入口模式,让所有admin的请求都通过一个入口文件处理,这样权限验证只需要做一次,后续扩展更灵活。

步骤1:设置admin入口文件

把admin目录下的所有功能文件(如dashboard.php、add_user.php)放到子目录(比如admin/includes),然后在admin根目录新建index.php作为入口:

<?php
session_start();

// 先做权限验证
if (!isset($_SESSION['user_id']) || !isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {
    header("Location: /login.php");
    exit;
}

// 根据URL参数分发到对应功能
$action = $_GET['action'] ?? 'dashboard';
$allowedActions = ['dashboard', 'add-user', 'user-list', 'profile', 'change-password'];

// 验证合法的操作,防止非法请求
if (!in_array($action, $allowedActions)) {
    $action = 'dashboard';
}

// 加载对应功能文件
require_once "includes/{$action}.php";
?>

步骤2:调整访问路径

比如原来的admin/dashboard.php改为admin/index.php?action=dashboard,可以配合.htaccess做伪静态优化,让URL更友好:

RewriteEngine On
RewriteRule ^dashboard$ index.php?action=dashboard [L]
RewriteRule ^add-user$ index.php?action=add-user [L]
# 其他功能的伪静态规则...

额外注意事项

  • 会话安全:登录成功后记得调用session_regenerate_id(true)更新会话ID,防止会话固定攻击;
  • 不要信任客户端数据:所有角色判断必须基于服务器端的$_SESSION,永远不要用客户端Cookie存储角色信息;
  • 静态文件权限:如果admin目录下有敏感的静态文件(如导出的用户数据),也要通过PHP脚本读取输出,不要直接暴露给浏览器。

内容的提问来源于stack exchange,提问作者Sonjoy Datta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:38:36