编程 Composer 2.9 默认拦截有漏洞的包版本:update 行为变化与升级清单

2026-09-17 21:03:24

Composer 2.9 默认拦截有漏洞的包版本:update 行为变化与升级清单

Composer 2.9.0 于 2025-11-13 发布。发布说明见 ,完整 changelog 在 ,版本 diff 见 。

这次升级里最需要留意的是安全相关的默认行为变化:composer update 不再无条件把你带到最新版本。

audit.block-insecure 默认开启

2.9 会自动拦截更新到有已知安全公告的包版本。该行为默认开启,防止不小心 update 到有漏洞的版本,可通过新配置项 audit.block-insecure 调整(默认 true)。

这是对已有 composer audit 命令的补充:audit 扫描 composer.lock,报告已安装包是否存在已知漏洞;audit.block-insecure 则把关卡前移到解析阶段。

相关配置:

  • audit.block-abandoned:拦截被废弃的包,默认 false,需要显式开启。
  • audit.ignore-abandoned:按包忽略废弃拦截。
  • audit 命令新增 --ignore-unreachable,用于无法访问某些仓库的环境(比如内网 CI 拿不到全部 advisory 源)。

如果你现在靠 roave/security-advisories 来阻止安装有漏洞的版本,这个功能完全取代它,可以从依赖里移除。对 CI 维护者来说,少一个 meta 包,也少一次它的版本同步。

allow-plugins 仍是安全基线

插件授权 allow-plugins(自 2.2 引入)依然是标配:未授权的插件在 install / update 期间不会执行代码,CI 中会直接失败。另外,自 2.4.2 起,检测到以高级权限(root/sudo)运行时,Composer 会自动禁用所有插件并给出警告。

新的 repository 命令

repository 相关的增删改现在可以直接在命令行完成,不必手改 composer.json(#12388)。仓库默认存成带 name 属性的 JSON 数组,便于寻址:

composer repo list
composer repo add foo vcs https://github.com/acme/foo
composer repo add bar composer https://repo.packagist.com/bar
composer repo add qux vcs https://example.org --after bar
composer repo remove foo
composer repo set-url foo https://git.example.org/acme/foo

--after 用来控制仓库顺序,set-url 适合镜像地址迁移。

lock 文件冲突自动恢复

只有 content-hash 属性冲突时,运行 update --lock,或重新 update 某个包,Composer 会读取 lock 文件并忽略 git 冲突标记,自动恢复(#11517)。多人同时改依赖的分支合并场景,这个改动能省掉大部分手工解冲突。

update --minimal-changes

完整更新时的保守选项:只改动满足变更约束所必需的包(#12349)。对应配置 update-with-minimal-changes,以及环境变量 COMPOSER_MINIMAL_CHANGES(#12545)。在 CI 里想缩小 diff、避免顺带升级无关依赖时比较有用。

平台与传输层

  • 原生支持 Forgejo / Codeberg 仓库(#12307)。
  • 支持 HTTP/3(#12363),需要 libcurl 支持;否则回退。
  • 自定义 header 认证(#12372)、客户端 TLS 证书(#12406)。

命令与输出的小改动

  • licenses 新增 --locked,显示 lock 文件而非已安装包的数据(#12595)。
  • 新增 SHELL_VERBOSITY 环境变量,控制 shell 脚本的详细度(#12473)。
  • init 支持非交互运行(#12546)。
  • 新增 COMPOSER_PREFER_DEV_OVER_PRERELEASE 环境变量,配合 --prefer-lowest 使用(#12585)。
  • Windows 下 self-update 支持 sudo 提权(#12543)。
  • 通过减少 autoloader 创建次数,提升 script handler 性能(#12456)。

修复项

  • dev 版本在 source 缺失时,dist ref 的显示问题。
  • 包被弃用但没有新 release 时,不再显示弃用警告(#12423)。
  • PHP preloading 难以调试的问题(#12528)。
  • Symfony 7 兼容问题。

2.9.0 内部变化与升级注意

代码库新增 Composer/DependencyResolver/SecurityAdvisoryPoolFilter.phpAdvisory/AuditConfig.phpdoc/06-config.mddoc/articles/authentication-for-private-packages.md 有较大更新,配置项变化建议对照文档确认。composer-plugin-api 升到 2.9.0,依赖该 API 的插件需要同步兼容版本。

升级时的取舍大致是:

  1. 新项目、常规业务仓库直接升。默认拦截有漏洞版本是净收益,遇到误报可以用 audit.block-insecure: false 或更细的忽略配置临时放行。
  2. 还在用 roave/security-advisories 的项目,升级后可以移除该依赖,但先跑一次完整 update 确认解析结果一致。
  3. 插件生态较重的项目,先把 composer-plugin-api 相关插件升级到支持 2.9 的版本再升级 Composer 本体。
  4. CI 中如果依赖 advisory 数据源但网络受限,注意给 audit--ignore-unreachable,否则可能因为拉不到公告而失败。

audit.block-abandoned 默认关闭,是否开启取决于项目对替代方案的容忍度:开启后,被废弃的包会直接挡住更新,老项目容易卡住,建议在非阻塞阶段先观察再启用。

复制全文 生成海报 Composer PHP 依赖管理 CI

推荐文章

程序员茄子在线接单