不会。composer update 默认仅按 composer.json 版本约束安装兼容最新版,不优先选择安全补丁版本;需配合 composer audit 检测漏洞,并手动指定修复版本或使用 --with-dependencies 确保关联依赖同步升级。

composer update 会自动装安全补丁吗?
不会。默认的 composer update 只按 composer.json 中的版本约束拉取最新兼容版本,不区分是否含安全修复。它可能跳过带补丁的次要版本(比如从 2.3.1 升到 2.4.0),而真正修复漏洞的往往是 2.3.2 这类小版本——但若你写的是 ^2.3,Composer 就只认 2.x 范围,2.3.2 符合条件,它其实会装;可一旦你锁死了 "monolog/monolog": "2.3.1" 或用了 ~2.3.0 这种窄约束,就很可能卡在带漏洞的版本上。
常见错误现象:composer outdated 显示有新版,但 composer update monolog/monolog 没反应;或者 CI 流水线扫出 CVE,本地却查不到更新。
- 检查你的约束是否太宽(如
^2.0)导致跳过补丁版——某些包在小版本里修安全,大版本反而没动 - 确认
composer.lock是否被意外提交了旧哈希,导致composer install固定在老版本 - 运行
composer show monolog/monolog看当前解析出的实际版本,再对比 packagist.org 页面上的 latest patch tag
用 composer audit 查真实漏洞,不是看版本号
composer audit 是 Composer 2.5+ 内置的安全扫描命令,它读取官方 Composer Security Advisories 数据库,比“有没有新版本”更准——它直接告诉你:当前装的这个 symfony/http-foundation 5.4.22 是否已被标记为存在 CVE-2023-45802。
使用场景:上线前检查、CI 中集成、接手老项目时快速摸底。
- 执行
composer audit --format=json可输出结构化结果,适合脚本解析 - 加
--no-dev参数排除开发依赖,避免误报(比如phpunit的漏洞通常不影响生产) - 如果提示
No security vulnerabilities found,不代表绝对安全——数据库可能未同步,或漏洞尚未公开收录
强制升到含补丁的最小版本:用 --with-dependencies 和精确版本号
当 composer audit 报出漏洞,且对应包的修复版是 7.2.5,但你的 composer.json 写着 "laravel/framework": "^7.0",Composer 默认可能只升到 7.2.4(因为 7.2.5 被判定为“非必要更新”)。这时得手动干预。
参数差异:--with-dependencies 不仅更新目标包,还顺手更新它的子依赖中同样有补丁的项;而单纯 composer update vendor/package 可能漏掉间接依赖里的漏洞。
- 先运行
composer require vendor/package:7.2.5 --no-update临时改写composer.json - 再执行
composer update vendor/package --with-dependencies,确保关联依赖也对齐 - 别用
composer update --lock,它只重算 lock 文件,不改依赖树 - 升级后立刻跑
composer audit验证,有些补丁需要配套更新其他包(比如guzzlehttp/guzzle补丁常牵连psr/http-message)
长期维护要靠策略,不是每次手动敲命令
靠人盯 composer audit 输出或每周 composer update 并不可靠。真正降低风险的是自动化 + 约束收紧。
性能 / 兼容性影响:过度宽松的版本约束(如 * 或 dev-main)会让 composer update 变慢,且增加引入破坏性变更的概率;但过严(如固定 1.2.3)又导致补丁无法落地。
- 在
composer.json里用^而非~,前者允许小版本和补丁更新(^1.2.3≡>=1.2.3 ),后者只允许补丁(<code>~1.2.3≡>=1.2.3 ) - CI 中加入
composer audit --no-dev --exit-on-violation,让构建失败倒逼修复 - 定期(比如每月)跑
composer update --dry-run看哪些包能升,结合composer show --outdated判断是否真有必要动
最常被忽略的一点:composer.lock 文件必须提交进 Git。很多人删了它以为能“重来”,结果 CI 拉下来的版本跟本地不一致,安全补丁看似装了,实际没生效。










