答案是升级未到位或开发习惯未改。需核查php think version输出、composer.lock实际版本、残留危险逻辑,禁用db::query拼sql、关闭app_debug、避免unserialize等危险操作,并验证route.php和app.php安全配置是否生效。

升级到最新版后漏洞还在,大概率不是版本问题,而是升级没到位或开发习惯没改。ThinkPHP的很多高危漏洞(比如RCE、SQL注入)在新版本里确实修复了,但如果你还沿用老写法、开着危险配置、或者根本没升到位,风险就还在。
确认是否真升到了修复版本
别只看主版本号,得看完整补丁号:
- 运行 php think version,输出结果必须是 6.0.14+(防CVE-2024-48112)、5.1.31+(防CVE-2018-20062)或 6.1.x 最新版
- 检查 composer.lock 中 topthink/framework 的实际安装版本,有时 composer update 被依赖锁死,表面升了,实际还是旧版
- 用 grep -r "invokefunction" vendor/topthink/ 查有没有残留的老路由解析逻辑(尤其在App.php里)
检查是否还在用危险开发方式
框架升级了,但代码没改,等于白升:
- 禁用 Db::query() 直接拼SQL,哪怕参数来自 input() 也不行;改用 where() 或 whereRaw(..., [$param])
- 关闭 APP_DEBUG = true —— 生产环境开启它等于把错误堆栈、路径、数据库配置全暴露给攻击者
- 不要手动用 unserialize($_GET['data']) 或类似操作,尤其在日志、缓存、上传回调等位置
验证关键安全配置是否生效
有些漏洞靠配置就能堵住,但默认未必开:
- 检查 config/route.php 是否设了 'url_route_must' => true,关掉它会让控制器名绕过校验
- 确认 config/app.php 中 'default_filter' 包含 htmlspecialchars,防止XSS
- 若用了多模块,确保 'url_domain_deploy' 和 'url_pathinfo_convert' 没被设成宽松模式
排查第三方组件和遗留代码
漏洞可能藏在你没注意的地方:
- 检查 vendor/ 里有没有老版本的 league/flysystem(CVE-2022-38352 就出在这儿),升级整个 flysystem 包
- 搜项目里有没有 preg_replace('/.*/e', ...) —— ThinkPHP 3.2 风格的写法,在 PHP 7.3+ 已废弃,但仍有系统在跑,一触发就 getshell
- 查看日志中是否有 Warning: preg_replace(): The /e modifier is deprecated,这是已被利用的明确信号
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











