ThinkPHP 6.0.14 已修复多语言文件包含漏洞,通过重构 LoadLangPack 中间件实现路径规范化与白名单校验;但需验证中间件注册、lang.switch 配置及自定义拼接逻辑,并关闭非必要功能以彻底规避风险。

ThinkPHP 6.0.14 已官方修复多语言文件包含漏洞,核心是重构了 LoadLangPack 中间件对 lang 参数的处理逻辑,不再直接拼接路径,而是引入路径规范化与白名单校验机制。但仅升级版本不等于高枕无忧——若配置残留、中间件未禁用或业务层自行拼接路径,风险仍存在。
确认是否真正修复到位
不能只看版本号,需验证三点:
- 检查
app/middleware.php中是否仍注册了\think\middleware\LoadLangPack::class;若项目不需要多语言,应直接注释或删除该行 - 查看
config/lang.php中'switch' => false是否生效(即使升级到 6.0.14,switch为true且中间件启用时,旧版路径逻辑仍可能被触发) - 搜索全项目是否存在手动调用
Lang::setLangSet($input)或input('lang')后拼接文件路径的代码——这类自定义逻辑不受框架升级保护
强制路径校验(升级后仍建议加)
在自定义语言加载逻辑或中间件中,务必对 lang 值做双重校验:
- 先用
basename()提取基础标识(防zh-cn/../../etc/passwd类构造) - 再拼路径后立即调用
realpath(),并严格比对是否以合法语言目录开头(如realpath(config('lang.path'))) - 若
realpath()返回false或前缀不匹配,必须中止并返回 400 错误,不可静默降级或默认加载
关闭非必要功能是最稳妥手段
多数国内项目实际无需动态语言切换。直接关闭可彻底规避该类风险:
立即学习“PHP免费学习笔记(深入)”;
- 在
config/lang.php中设'switch' => false - 从
app/middleware.php移除LoadLangPack注册 - 删除或重命名
app/lang/目录(避免攻击者通过其他入口尝试读取) - 检查模板或 JS 是否硬编码了
?lang=请求——这类前端残留可能诱导测试工具误报
6.0.14 的修复是有效的,但安全落地依赖配置清理和使用克制。不复杂但容易忽略。



















