ThinkPHP上传目录禁PHP执行的核心是Web服务器不解析其中PHP文件:必须移出Web根目录(如runtime/uploads/),Nginx用location精准拦截,Apache用php_flag engine off,Linux权限设755且属主非Web进程用户。

ThinkPHP上传目录禁止PHP脚本执行,核心不是删文件或改代码,而是让Web服务器压根不解析其中的PHP文件——这是防WebShell的最后一道硬防线。
必须把上传目录移出Web根目录
最彻底的方式:上传文件存到 runtime/uploads/ 或 storage/app/uploads/ 这类路径,它们默认不在 public/ 下,Nginx/Apache 无法通过 URL 直接访问。只要物理路径不可达,执行风险就归零。
如果业务强依赖直链(如富文本编辑器插入图片),也绝不能妥协放回 public/uploads/;应走控制器代理下载,用 readfile() 输出并加安全头:
header('X-Content-Type-Options: nosniff');header('Content-Disposition: attachment; filename="safe.jpg"');
Nginx 配置:精准拦截 PHP 解析
在站点配置中添加明确的 location 规则,拒绝所有匹配上传路径下的 PHP 类文件:
location ~ ^/(runtime|storage)/.*\.(php|php5|phtml|phar|htaccess)$ {
return 403;
}
注意:不要只写 /uploads/ —— 如果你把上传目录设为 runtime/uploads,那 /uploads/ 这个URL根本不存在,规则无效;必须按实际部署路径写,比如 runtime/ 或 storage/。
Apache 配置:用 .htaccess 或主配置关引擎
若上传目录在可写子目录下(如 public/uploads),在该目录内放一个 .htaccess 文件,内容为:
php_flag engine off
<filesmatch>
Require all denied
</filesmatch>
更稳妥的做法是在虚拟主机配置里统一禁用,避免.htaccess被覆盖或忽略。
Linux 权限与用户隔离补一刀
上传目录权限设为 755,属主为部署用户(如 deploy),不要设为 www-data 或 nginx 用户。这样即使攻击者上传了 .php 文件,Web 进程因无权读取或执行,也无法触发。
同时确认该目录下没有 index.php、.user.ini 或其他可被利用的解析控制文件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











