PHP上传目录必须禁止脚本执行,Apache需用FilesMatch配合SetHandler none和Require all denied,Nginx需用精确location匹配加deny all,并辅以权限控制、noexec挂载及SELinux/AppArmor策略,实测大小写及编码绕过均应返回403/404。

在PHP虚拟目录下,上传目录必须禁止脚本执行——这不是可选项,而是安全底线。否则攻击者上传恶意.php、.phtml甚至大小写变体(如.PHP)或编码绕过(如.php%3f)文件后,可直接通过URL访问并执行任意代码,导致服务器沦陷。
Apache:用配合FilesMatch精准拦截
仅靠PHP层校验文件扩展名完全不可靠。必须在Web服务器层做硬性阻断:
- 在虚拟目录对应的
块内添加子块 - 内部设为
SetHandler none+Require all denied(Apache 2.4+) - 务必加
Options -ExecCGI -Includes,禁用CGI和服务器端包含 - 若使用
mod_php,还需显式RemoveHandler .php防止AddType误触发
Nginx:location匹配+fastcgi_intercept_errors双保险
上传目录(如/uploads/)需独立配置location ~ ^/uploads/.*\.(php|phtml|phar|phps|pht)$:
- 内部必须含
deny all;,彻底拒绝访问 - 补上
fastcgi_intercept_errors on;,防止错误页面泄露路径或状态 - 避免用
~* \.php$这种宽泛正则——它可能匹配到/uploads/xxx.php/xxx.jpg等路径遍历尝试 - 同时检查是否启用
secure_link或map模块做额外白名单控制(非必需但推荐)
权限与文件系统层面加固
Web服务器配置只是第一道防线,底层也要堵死漏洞路径:
- 上传目录本身不存放任何可执行脚本,且禁止
chmod +x操作 - 确保目录属主为
www-data:www-data(或对应Web用户),但不要给组或其他人执行位(即不用755,建议750) - 若用ext4文件系统,可加
noexec挂载选项(如/var/www/site1/uploads /var/www/site1/uploads ext4 defaults,noexec,nosuid,nodev 0 0) - SELinux用户需确认上下文为
httpd_sys_rw_content_t而非httpd_exec_t;AppArmor需明确禁止/{,var/}www/**.php px,类规则
验证是否生效的三个关键动作
配完不能只信配置语法正确,要实测:
- 上传一个内容为
的test.php到该目录 - 用浏览器或curl访问
https://yoursite.com/uploads/test.php,应返回403或404,绝不能输出phpinfo - 再试
test.PHP、test.pHp、test.php%3f,全部必须同样被拒
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











