快速确认tp5是否暴露:1. 访问/?s=/index/index/&debug=1,返回sql或路径即app_debug仍为true;2. 直接请求/runtime/log/,若可列目录则日志未屏蔽;3. 访问当天日志路径如/runtime/log/202610/15.log,200且明文即已沦陷。

如何快速确认线上TP5是否已暴露日志
不用翻代码,三步浏览器直验:
- 访问任意页面后加
?s=/index/index/&debug=1,若返回大量 SQL 语句或完整堆栈路径,说明APP_DEBUG仍为true - 直接请求
/runtime/log/,若列出年份目录(如202608/)或显示Index of /runtime/log/,证明目录浏览未禁用 - 构造当天日志路径,如
/runtime/log/202610/15.log,HTTP 状态码为200且响应体是明文日志内容,即已沦陷
为什么删日志前必须先关 DEBUG
DEBUG 开着,框架每秒都在写新日志。你刚清空 runtime/log/,两分钟内就又生成带数据库密码的 202610/15.log——等于白清。
- 关闭位置:检查
app.php中'debug' => true,改为false;同时确认extra/debug.php文件是否存在,存在则直接删除 - 入口文件陷阱:
public/index.php里若有define('APP_DEBUG', true),必须删掉或设为false,否则配置文件里的修改会被覆盖 - 验证方式:改完重启 PHP-FPM 或 Web 服务,再跑一次
?debug=1测试,应返回 404 或空白页
Nginx 封禁 runtime 目录的最小安全配置
只封 .log 不够,攻击者可尝试 .php、.html 甚至备份文件(如 .log.bak),必须按扩展名+路径双重拦截。
- 在 server 块中添加:
location ~ ^/runtime/.*\.(log|php|html|bak|swp|git)$ { deny all; } - 注意
^/runtime/的^和结尾$,防止绕过(如/runtime/abc/../log/1.log) - 重载配置后,用
curl -I http://yoursite.com/runtime/log/202610/15.log验证返回403 Forbidden
审计时最容易被忽略的两个残留点
修完主路径,别以为万事大吉。TP5 日志泄露常因“多处写、单处封”而复发。
-
runtime/cache/下可能存有调试缓存,含 SQL 查询片段,需同步执行chmod 750 runtime/cache并在 Nginx 中一并封禁该路径 - 某些自定义日志驱动(如写入
/var/log/thinkphp/)不受runtime配置控制,必须 grep 全项目:grep -r 'Log::record\|think\log' app/ --include="*.php",确认无硬编码外部路径
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











