最根本的安全措施是将上传目录移出Web根目录,如改用runtime/uploads或storage/uploads;Nginx需配置location正则禁止PHP解析,Apache需禁用PHP引擎;辅以755目录权限和644文件权限。

ThinkPHP 本身不控制脚本是否能执行,真正起作用的是 Web 服务器(Nginx 或 Apache)的配置。上传目录禁止脚本执行,核心是让服务器拒绝解析该目录下的 PHP 类文件,哪怕文件后缀是 .php、.phtml、.php5 等,也一律返回 403 或直接拒访。
把上传目录移出 Web 根目录
这是最根本的安全动作。不要把上传文件存到 public/uploads 这类可被 URL 直接访问的路径下。推荐改用:
- runtime/uploads(TP 默认 runtime 可写,且不在 public 下)
- storage/uploads(需手动创建并确保 Web 进程有写权限)
这两个路径默认无法通过浏览器 URL 访问,天然隔离执行风险。
Nginx 配置:显式禁止 PHP 解析
在站点配置的 server 块中加入以下规则(以 runtime/uploads 为例):
location ~ ^/runtime/uploads/.*\.(php|php5|phtml|phps|phar)$ {
return 403;
}
# 同时建议禁止访问整个 runtime 目录(除静态资源外)
location ~ ^/(runtime|vendor|app|config|database|extend)/ {
deny all;
}
location ~ /\.env|\.git|\.ht {
deny all;
}
注意:^/runtime/uploads/ 中的开头斜杠不能省,否则可能匹配失败;正则末尾加 $ 防止后缀绕过(如 shell.php.jpg 不会命中,但 shell.php 会)。
Apache 配置:关闭 PHP 引擎
在上传目录(如 runtime/uploads)下新建 .htaccess 文件,内容为:
php_flag engine off RemoveHandler .php .php5 .phtml .phps .phar
若服务器禁用了 .htaccess 覆盖(常见于生产环境),则必须在虚拟主机配置中显式设置:
<directory>
php_flag engine off
RemoveHandler .php .php5 .phtml .phps .phar
</directory>
Linux 文件权限辅助加固
即使 Web 服务器配置正确,也建议从系统层补一层:
- 上传目录设为 755(所有者可读写执行,组和其他人仅读执行)
- 确保该目录不属于 www-data / nginx 用户(例如归 root 或 deploy 用户),避免 Web 进程意外获得写+执行权限
- 上传后的单个文件保持 644,不给执行位
命令示例:
chown -R root:www-data runtime/uploads
chmod -R 755 runtime/uploads
find runtime/uploads -type f -exec chmod 644 {} \;
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











