本文目录导读:

- 文件系统与目录访问权限(防止直接访问敏感文件)
- 用户登录与角色鉴权(应用层权限控制)
- 路由与 API 接口权限(分级访问)
- IP 白名单 / 黑名单(限制特定来源访问)
- 禁用危险 PHP 函数(server 层面)
- 强制 HTTPS(传输层权限保护)
- 建议配置清单
在 PHP 项目中配置网站访问权限,通常涉及两个层面:Web 服务器层面(如 Nginx、Apache)和 PHP 应用层面(如用户登录、路由鉴权),对于“权限”这个广义概念,还可以细分为文件访问权限、目录访问权限、用户认证权限以及API 接口权限。
以下从这几个维度分别给出配置方案:
文件系统与目录访问权限(防止直接访问敏感文件)
这是最基本的安全配置,防止用户直接访问 PHP 源码、配置文件或数据库文件。
通过 Web 服务器配置(以 Nginx 为例)
# 1. 禁止访问 .env 配置文件(包含数据库密码)
location ~ /\. {
deny all;
}
# 2. 禁止访问 storage 或 runtime 目录下的 PHP 文件(防止直接运行缓存或日志)
location ~* ^/(storage|runtime)/.*\.php$ {
deny all;
return 403;
}
# 3. 禁止访问以 .sql、.txt、.log、.git 等结尾的敏感文件
location ~* \.(sql|txt|log|md|yml|json|lock)$ {
deny all;
return 403;
}
通过 .htaccess 配置(Apache 环境)
在项目根目录或敏感目录下创建 .htaccess 文件:
# 禁止访问隐藏文件(如 .env、.git)
RewriteRule ^\. - [F,L]
# 禁止直接访问 storage 目录
RedirectMatch 403 ^/storage/
# 禁止访问 SQL/LOG 文件
<FilesMatch "\.(sql|log|txt|md|env)$">
Require all denied
</FilesMatch>
目录权限设置(Linux 服务器)
# 项目根目录(755 表示可读可执行,不可写,除非是缓存目录) chmod -R 755 /path/to/your/project # runtime/cache 目录需要写入权限(php 进程写日志、缓存) chmod -R 775 /path/to/your/project/storage # 设置正确的所有者(建议使用 www-data 或 nginx 用户) chown -R www-data:www-data /path/to/your/project
用户登录与角色鉴权(应用层权限控制)
PHP 项目中通常使用 Session 或 JWT 来管理用户登录态,配合中间件实现权限校验。
基础示例:通过 Session 控制页面访问
// login.php - 登录后设置 session
session_start();
if ($password_verified) {
$_SESSION['user_id'] = 1;
$_SESSION['role'] = 'admin'; // admin / editor / user
}
// admin.php - 仅允许管理员访问
session_start();
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('HTTP/1.1 403 Forbidden');
die('无权限访问');
}
// 正常渲染页面...
使用中间件(常见于 Laravel / ThinkPHP 框架)
Laravel 示例:
// 在控制器构造函数中调用中间件
public function __construct() {
$this->middleware('auth'); // 必须登录
$this->middleware('admin'); // 自定义管理员中间件
$this->middleware('permission:edit'); // 特定权限
}
ThinkPHP 6 示例:
// 在路由中绑定中间件
Route::group('admin', function () {
Route::get('dashboard', 'Admin/dashboard');
})->middleware(['AuthCheck', 'AdminRole']); // 登录检测 + 角色验证
路由与 API 接口权限(分级访问)
通过路由分组 + 中间件实现不同角色访问不同接口。
示例:RESTful API 权限结构
/api/public/login - 无需权限(登录接口)
/api/user/profile - 需要普通用户 token
/api/admin/users - 需要管理员 token
/api/super/clear-cache - 需要超级管理员 token
伪代码实现(基于 Token 鉴权):
function checkApiPermission($requiredRole) {
$token = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
$user = jwtDecode($token); // 解析 JWT
if (!$user || !in_array($requiredRole, $user['roles'])) {
http_response_code(403);
echo json_encode(['error' => '权限不足']);
exit;
}
}
// 路由分发时调用
if ($uri === '/api/admin/users') {
checkApiPermission('admin');
// 返回用户列表...
}
IP 白名单 / 黑名单(限制特定来源访问)
适用于后台管理面板、API 调用方限制等场景。
Nginx 层限制(效率高)
# 仅允许公司内网 IP 访问 /admin 路径
location ^~ /admin {
allow 192.168.1.0/24; # 内网段
allow 114.114.114.114; # 特定 IP
deny all; # 其余拒绝
try_files $uri $uri/ /index.php?$query_string;
}
# 限制 PHPMyAdmin 只允许本机访问
location /phpmyadmin {
allow 127.0.0.1;
deny all;
}
PHP 代码层限制
$allowed_ips = ['192.168.1.100', '203.0.113.50'];
if (!in_array($_SERVER['REMOTE_ADDR'], $allowed_ips)) {
http_response_code(403);
exit('IP 被禁止');
}
禁用危险 PHP 函数(server 层面)
一些函数可能被利用来绕过权限或读取敏感文件(如 exec、system、file_get_contents 远程文件)。
在 php.ini 中修改 disable_functions:
disable_functions = exec, system, passthru, shell_exec, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source
如果使用 Docker 或虚拟主机无法修改 php.ini,可以在 .user.ini 中设置(支持 per‑directory):
disable_functions = exec, system, passthru
强制 HTTPS(传输层权限保护)
即使是权限校验通过,如果数据走明文 HTTP,Session/Cookie/Token 仍可能被截获。
Nginx 强制跳转
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
# SSL 证书配置...
}
PHP 代码检测(备用)
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') {
header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
exit;
}
建议配置清单
| 维度 | 措施 | 配置位置 |
|---|---|---|
| 文件访问 | 禁止访问 .env、storage/sql/log 等敏感文件 | Nginx / Apache |
| 目录权限 | 设置 755/775 所有权为 www-data | Linux Shell |
| 登录鉴权 | Session + 角色中间件 | PHP 应用代码 |
| API 权限 | JWT + 角色/权限校验 | PHP 路由中间件 |
| IP 限制 | Nginx allow/deny 或 PHP 数组白名单 | Nginx / PHP |
| 函数禁用 | 禁用 exec、system 等危险函数 | php.ini |
| 传输安全 | 强制 HTTPS | Nginx |
注意:权限配置应遵循最小权限原则,只给用户或进程完成其任务所必须的最小权限,同时定期审计日志以发现异常访问。