禁用上传目录脚本解析权限的核心是Web服务器层精准拦截:Apache用配合Require all denied,Nginx用location ~ ^/uploads/.*\.(?i:php|...)$ { return 403; },并辅以chmod -x和根外存储等系统级约束。

禁用上传目录的脚本解析权限,核心是让 Web 服务器(Apache 或 Nginx)明确拒绝执行该目录下的 PHP 类文件,而不是依赖 PHP 层面的校验——因为攻击者一旦上传了 .php 文件,只要能直接请求访问,就可能绕过所有 PHP 逻辑。
Apache:用 + FilesMatch 精确拦截
在虚拟主机配置或主配置中,针对上传目录路径(如 /var/www/site/uploads)添加如下块:
<directory></directory>- 内部必须包含
AllowOverride None(防止 .htaccess 覆盖规则) - 用
<filesmatch></filesmatch>匹配常见可执行/敏感后缀 - 搭配
Order deny,allow和Deny from all(Apache 2.4 推荐改用Require all denied) - 确保该
块加载顺序早于其他可能放行的规则,避免被覆盖
Nginx:用 location 精准匹配并返回 403
在 server 块内,对上传路径(如 /uploads/)添加独立 location 块:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
location ~ ^/uploads/.*\.(?i:php|php3|phtml|phar|inc|sh|pl|py)$ {- 必须加
^锚定开头,防止路径遍历(如/uploads/../shell.php) - 使用
?i忽略大小写,覆盖.PHP、.PhP等变体 - 结尾加
$防止正则误匹配(如image.php.bak不应被拦截,但若业务允许备份文件,建议一并过滤) - 写入
return 403;或deny all;,不要用fastcgi_pass
额外加固:权限与路径隔离双保险
仅靠 Web 服务器拦截还不够,需配合系统层约束:
- 上传目录本身不设执行位:
chmod -x /var/www/site/uploads,使即使解析器误触发也无法执行 - 将上传目标路径设在 Web 根目录之外(如
/data/uploads/),再用 alias 映射静态资源,彻底切断脚本执行路径 - 确认 PHP 的
open_basedir不包含上传目录,防止 include/fopen 绕过 - 检查 SELinux/AppArmor 是否启用,并确认策略未放行 Web 进程在该目录下执行脚本
这些措施不是选做项,而是必须同时落地。单靠某一层防护,都存在被绕过的成熟手法。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










