thinkphp 8.0 已于2023年6月30日正式发布,当前最新稳定版为8.1.0,兼容php 8.4;所谓“tp8.0尚未发布”是过时误解,实际升级需严格匹配php 8.1+、think-orm 3.0及psr-14等新要求。

ThinkPHP 8.0 尚未发布,你实际要升的其实是 TP6.x(如 6.3.x)——但很多团队误称“升级到 TP8”,导致后续排查方向全错。直接按 TP6 升级路径做全局扫描,才能避开版本幻觉带来的漏检。
确认真实目标版本和 PHP 环境
别信项目里写的 thinkphp/8.0 或 composer.json 里的假版本号。先执行:
php think version
再查 PHP 版本:
php -v
TP6.3.x 要求 PHP ≥ 8.0,若当前是 PHP 7.4 或更低,必须先升级 PHP,否则连 composer update 都会失败。常见错误现象:Class "think\Service" not found,本质是 PHP 版本不兼容导致自动加载失败,不是框架代码问题。
- TP6.0.x 支持 PHP 7.2–8.1
- TP6.3.x 要求 PHP 8.0–8.3(官方明确不支持 8.4+)
- 所有
tp5的vendor/topthink/thinkphp必须彻底删除,不能保留旧包混用
路由与中间件链路断点扫描
TP5 的 route.php 全局路由定义、__construct() 中手动调用 checkAuth() 等写法,在 TP6 中会被中间件机制覆盖或忽略。重点扫三类断点:
- 检查
app/middleware.php是否存在且启用CheckAuth::class,若仍沿用 TP5 的闭包式中间件(如function() { if (!session('user')) exit; }),TP6 不识别,直接跳过鉴权 - 扫描所有控制器方法,确认是否还残留
if (!$this->auth->check())这类手动校验——TP6 推荐统一走中间件,重复校验反而可能因 session 初始化时机错乱导致绕过 - 运行
php think route:list --debug,过滤出middleware: []的路由项,尤其是含delete、import、config的路径,这些就是未授权访问高危点
静态分析捕获松散比较与动态加载风险
Psalm 是目前对 TP6 安全语义识别最准的工具,但默认配置几乎无效。必须手动加两处关键配置:
- 在
psalm.xml中启用<taintanalysis></taintanalysis>,并确保vendor/vimeo/psalm≥ 5.25 - 为 TP 的请求入口补类型注解:在
think\Request类方法上加@psalm-taint-source input,否则 Psalm 不知道input()->get('id')是污染源 - 装插件
orklah/psalm-insane-comparison,它能揪出$user->role == 'admin'这类松散比较——TP5 升上来常带这种写法,PHP 8 下null == 'admin'仍为 false,但攻击者传0或1admin就可能绕过
不配这两项,Psalm 扫出来的结果基本是噪音。
调试接口与安装脚本残留检查
TP5 项目常遗留 public/install.php、public/upgrade.php,TP6 默认不提供这些文件,但升级时没人删。更隐蔽的是 .env 里残留 app_debug=true + APP_TRACE=true,导致 /route、/trace 接口可被未授权访问。实操建议:
- 用
grep -r "install\|upgrade\|debug\|trace" public/ .env快速定位 - 检查
app/config/app.php中app_debug是否被环境变量覆盖,有些项目把开关写在.env却忘了上线时改 - TP6 的调试接口路径已变,
/route在 TP6 中需显式注册路由才暴露,但旧版路由规则如Route::any('[^/]*/[^/]*', ...)可能意外匹配并执行
真正容易被忽略的,是那些“看起来没用但其实开着”的调试端点——它们不报错、不跳转、返回 200,却把整个路由表吐给攻击者。











