接手一个 2019 年上线的商城,composer.lock 里躺着 topthink/framework 5.0.24,安全扫描一跑,报告标红好几条。客户问能不能直接升到最新版,答案是不能一步到位,5.0 到 5.1 的改动就足够让项目起不来。

这个版本处在什么位置

5.0 分支早就停止功能更新,5.0.24 属于该分支后期的补丁版本。框架本身结构简单,入口文件加载 thinkphp 目录下的引导文件,路由、模型、模板引擎的写法和后面的 5.1、6.0 差别不小。官方长期维护的是 6.0 和 8.0,5.0 不在其列。

先做隔离,再谈升级

  • 关掉调试模式。配置里的 app_debug 设为 false,异常页面不再输出堆栈和路径,这一步能挡掉大量信息泄露。
  • 入口收敛。后台路径改名,关闭不用的模块,静态资源走 CDN,减少框架暴露面。
  • 前置一层网关或 WAF,把明显的异常请求挡在 PHP 之前,给升级争取时间。
  • 日志和上传目录禁止执行 PHP,这两个目录是历史上被利用最多的位置。

升级路线的实际选择

小项目、代码量不大,直接照着 6.0 的文档重写控制器和模型层,比一层层迁移更快。中等项目可以走 5.0 到 5.1,再评估是否继续。5.1 改的是目录结构和容器用法,门面类和助手函数大部分还在,改造成本可控。再往上到 6.0 需要 PHP 7.1 以上,8.0 要求 PHP 8,老服务器的 PHP 版本往往卡在这一步。

动手前把测试用例补到核心链路,至少覆盖登录、下单、支付回调。没有测试就升级,等于在线上试错。

决定不升的话怎么维持

把框架锁在一个可用的补丁版本,不改 vendor 里的代码,用 composer 的版本约束固定住。定期看官方仓库的提交记录,有新补丁就小步跟进。数据库账号按最小权限给,应用账号不要有 drop 权限,这条比任何框架层面的加固都实在。

五年以上的项目,升级的成本通常低于继续维护的成本,只是要挑业务空窗期做,别在大促前动框架。升级前把 vendor 目录和数据库各做一份完整备份,回滚时才不至于手忙脚乱。