cve-2020-15148修复导致不兼容:yii\db\batchqueryresult新增__wakeup()抛出异常,任何反序列化该类的旧代码(如缓存读取、unserialize用户输入)将直接报错中断;其余api和常规功能保持向后兼容。

Yii 2.0.38 升级本身是向后兼容的,但**修复 CVE-2020-15148 的关键改动会影响部分依赖反序列化行为的旧代码**。
核心修复点直接影响兼容性
该版本在 yii\db\BatchQueryResult 类中新增了 __wakeup() 方法,内容为直接抛出异常:
这意味着:任何尝试反序列化该类实例的代码(例如从缓存、Session 或日志中读取旧序列化数据),在升级后会立即报错中断,而非静默失败或继续执行。
哪些旧代码可能出问题
- 手动调用
unserialize()处理用户输入或不可信数据源(如 Cookie、GET 参数)——这是漏洞根源,升级后将直接崩溃,需彻底移除或替换为安全方案(如 JSON) - 将
BatchQueryResult实例持久化到 Redis/Memcached/文件缓存,并在后续请求中反序列化恢复 —— 升级后首次读取即失败 - 自定义序列化逻辑中显式包含或间接引用该类(如继承、组合、Mock 测试数据)—— 反序列化路径被阻断
其他组件未引入破坏性变更
官方发布说明明确指出,2.0.38 是一个安全补丁版本,不包含 API 移除、方法签名修改或配置项废弃。以下行为仍保持兼容:
- 控制器、模型、视图、路由、数据库查询等常规开发逻辑无需修改
- 使用
serialize()存储自定义对象(不含BatchQueryResult或其他已加固类)仍可正常反序列化 - 配置文件结构、组件注册、事件绑定等运行时机制无变化
升级前建议操作
不是简单执行 composer update 就能高枕无忧:
- 全局搜索项目中所有
unserialize(调用,确认是否传入用户可控数据;如有,必须重构 - 检查缓存层是否存储了
BatchQueryResult或其子类实例;如有,清空对应缓存键或增加版本标识隔离 - 运行完整测试套件,特别关注涉及数据导出/导入、Session 恢复、队列任务反序列化的用例











