ThinkPHP部署后必须关闭调试模式、收紧日志等级、设置Cookie安全属性、禁用自动路由、过滤危险参数并限制服务器访问。具体包括:APP_DEBUG=false、log_level仅保留error/warning、Cookie启用httponly/secure/samesite、auto_route=false、入口文件及Nginx拦截敏感请求与目录。

ThinkPHP部署后必须做安全加固,否则调试开关开着、日志乱写、路由裸奔、Cookie不设防护,等于把服务器大门敞开。光升级版本没用,关键在配置改到位、代码清干净、服务器拦得住。
关闭调试与日志泄露入口
生产环境第一件事:确认 APP_DEBUG = false。在 config/app.php 中强制设为 false,同时检查 .env 文件里 APP_DEBUG=false 是否生效。只要它为 true,Runtime/Log/ 下就会生成含 SQL、路径、POST 参数的明文日志,攻击者能直接请求 /runtime/log/24_08_25.log 下载。
做完立刻清空整个 runtime/log/ 目录——旧日志还在磁盘上,命名规则固定,极易被批量扫出。
再收紧日志等级:log_level => ['error', 'warning'],避免 info 级别记录用户输入、token 或临时变量,防止敏感数据落盘。
立即学习“PHP免费学习笔记(深入)”;
加固 Cookie 与 Session 安全
打开 config/cookie.php(或 config/app.php 中的 cookie 配置段),三项必须设全:
- httponly => true:阻止 JavaScript 读取 session_id,防 XSS 窃取会话
- secure => true:仅 HTTPS 环境启用,否则 Cookie 明文传输,中间人可截获
- samesite => 'Lax':平衡 CSRF 防护与跨域跳转兼容性,比 Strict 更稳妥
禁用高危默认功能
自动路由是最大隐患之一。在 config/app.php 中设 auto_route => false,否则任意控制器方法(如 delete、export)都可通过 URL 直接调用,无需路由定义,极易暴露未授权接口。
若项目不用多语言,直接删掉 app/middleware.php 中的 \think\middleware\LoadLangPack::class;保留的话,必须加 realpath 白名单校验,否则 ?lang=../../../../etc/passwd 可触发目录遍历。
确保 remote_debug => false,该开关一开,攻击者能构造请求激活调试通道,绕过常规访问控制。
入口文件与 Web 服务器双层拦截
在 public/index.php 的 define('APP_PATH', ...) 后插入参数过滤逻辑:
- 拦截危险键名:
s、_method、function、filter、\think\等 - 检查 GET/POST/COOKIE 中是否含敏感字符串,命中即返回 403
- 限制允许的请求方法,只放行
GET、POST、PUT、DELETE
Nginx 层也要加规则,比如拒绝访问 /runtime/ 目录、拦截含 eval( 或 system( 的请求 URI,从源头掐断常见攻击链。



















