ThinkPHP部署需严格配置权限与安全策略:runtime目录须赋予Web用户读写权但禁用777;public必须为Web根目录且index.php权限设为644;上传目录需单独授权并禁止PHP执行;生产环境必须关闭app_debug和app_trace。

Web服务器用户对runtime目录必须有读写权限
ThinkPHP运行时生成缓存、日志、路由映射等文件全靠runtime目录,如果www-data(Debian/Ubuntu)或nginx(CentOS/RHEL)用户没写入权,页面直接500,日志里常见failed to open stream: Permission denied。
- 执行
chown -R www-data:www-data runtime/(Ubuntu)或chown -R nginx:nginx runtime/(CentOS) - 别用
chmod 777 runtime/——这等于把门敞开,安全扫描工具一扫就报高危 - 如果项目在
/var/www/html/下,确认父目录至少对web用户可执行(chmod 755 /var/www/html),否则连目录都进不去
public/目录必须设为Web根目录,且index.php不可被直接写入
ThinkPHP要求所有HTTP请求经由public/index.php入口,如果把整个项目根目录设为Web根,app/、config/这些敏感目录可能被直接访问,泄露配置甚至数据库密码。
- Nginx配置里
root必须指向public/,不是项目根目录;Apache则需启用mod_rewrite并确保.htaccess生效 - 检查
public/下index.php权限是否为644(chmod 644 public/index.php),写权限留着等于给攻击者留后门 - 如果用Nginx,确认
location ~ \.php$块里包含fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;,否则$_SERVER['SCRIPT_FILENAME']路径错乱,TP自动检测环境失败
上传目录(如public/uploads/)要单独放开写权限,但禁止执行PHP
用户上传的图片、附件需要可写,但如果uploads/目录允许PHP执行,上传一个shell.php就等于交出服务器控制权。
- 设权限:
chown -R www-data:www-data public/uploads/ && chmod -R 755 public/uploads/ - Nginx中加限制:
location ~ ^/uploads/.*\.php$ { deny all; },Apache则在uploads/下放一个.htaccess:php_flag engine off - 别图省事把
uploads/建在runtime/里——TP会自动清理runtime,上传文件随时被删
部署后务必检查config/app.php里的app_debug和app_trace
开发环境开调试模式没问题,但上线后app_debug => true会暴露完整错误堆栈、数据库连接信息、甚至服务器路径,搜索引擎爬虫一抓就是一份渗透情报。
立即学习“PHP免费学习笔记(深入)”;
- 生产环境必须设为
'app_debug' => false,且确认env文件里APP_DEBUG=false已生效(TP6起优先读.env) - 如果用了
app_trace,同样关掉——它会在页面底部输出SQL和变量,比app_debug更隐蔽但风险不低 - 改完记得清缓存:
php think clear,否则配置可能被缓存住,重启PHP-FPM也不生效
ls -Z和ausearch -m avc -ts recent才是真·排查起点。


















