ThinkPHP 6.0.15已修复CVE-2022-38352等关键漏洞,但安全闭环需排查旧代码残留、自定义逻辑绕过、配置未更新三类问题,重点验证版本生效、lang参数校验、用户输入文件操作、view路径拼接及服务器配置。

确认升级确实生效
很多所谓“已升级”的项目,实际运行的仍是旧版本缓存或 Composer 未刷新依赖。
- 执行
php think version,输出必须为 v6.0.15(注意是字母 v 开头) - 检查
vendor/topthink/framework/composer.json中"version": "v6.0.15" - 清空
runtime/目录(尤其是cache/和log/),避免旧中间件或模板编译结果被复用
重点审计 lang 参数相关逻辑
即使升级到 6.0.15,若项目手动注册了 LoadLangPack 中间件,且未做路径校验,攻击者仍可通过 ?lang=../../../etc/passwd 读取敏感文件。
- 搜索
app/middleware.php是否包含\think\middleware\LoadLangPack::class - 若存在,检查是否已按规范加入 realpath + 白名单校验(参考官方加固写法)
- 更彻底的做法:在
config/lang.php中设'switch' => false,直接关闭多语言功能
扫描用户输入直连文件操作的代码
ThinkPHP 不会主动调用 include() 或 file_get_contents(),但开发者常在控制器里写:include input('file') . '.php' —— 这类代码完全绕过框架所有防护。
- 全局搜索关键词:
include(、require(、file_get_contents(、fopen(、readfile( - 对每个匹配点,确认参数是否来自
input()、$request->param()、$_GET、$_POST等用户可控源 - 凡涉及拼接路径的,必须有
realpath()+strpos(..., ROOT_PATH) === 0双重校验
检查 view() 模板动态加载是否绕过路径限制
CVE-2025-63888 类漏洞在 6.1.0+ 仍存在,而 6.0.15 虽默认关闭危险模式,但业务代码若显式拼接路径,就可能重新打开缺口。
立即学习“PHP免费学习笔记(深入)”;
- 搜索所有
view(调用,尤其关注含input()、$request->param()、..、.的字符串拼接 - 例如:
view('admin/' . $this->request->param('tpl'))或view('../public/' . input('f'))都需立即重构 - 强制统一使用命名空间式模板名(如
admin/index),禁用相对路径和用户拼接
验证服务器层基础防护是否到位
再安全的 PHP 代码,也挡不住 Web 服务器配置错误导致的目录泄露。
- Nginx 配置中确认存在针对
app/、config/、runtime/的拒绝访问规则 - 检查
APP_DEBUG = false在生产环境真实生效(不是仅在 .env 里写了,还要确认未被覆盖) - 确认
public/是唯一 Web 可访问目录,其他敏感路径无法通过 URL 直接访问



















