roave/security-advisories不是扫描工具而是依赖拦截器,它在composer install/update阶段通过conflict规则阻止含CVE的包版本安装,属预防性阻断;不扫描已安装包,不修复旧漏洞,仅影响新依赖解析。

为什么 roave/security-advisories 不是“扫描工具”而是“依赖拦截器”
它不会在安装后检查漏洞,而是在 composer install 或 composer update 阶段,通过声明冲突(conflict)阻止已知含高危漏洞的包版本被拉取。本质是把 CVE 数据转成 Composer 的约束规则,属于“预防性阻断”。
常见误解:以为装上就能自动修复旧项目里的问题——其实它只对新安装/升级生效;已有带漏洞的包不会被卸载或降级,必须手动处理。
- 它不修改
composer.json,也不写入composer.lock,只在解析依赖图时参与版本决策 - 所有拦截逻辑来自 Roave 官方维护的 advisories 列表,更新频率高,覆盖主流 PHP 生态(Symfony、Laravel、Monolog、Twig 等)
- 不兼容 PHP 7.4 以下版本;若项目锁定了旧版
composer(如 1.x),需先升级到 Composer 2+ 才能正确识别冲突
如何正确添加 roave/security-advisories 到项目
不是作为普通依赖 require 进来,而是以 require-dev 方式引入,并确保其 conflict 规则全局生效。最简且推荐的做法:
composer require --dev roave/security-advisories:dev-latest
注意:dev-latest 是一个虚拟分支,始终指向最新 advisory 数据;不要用 ^x.y 版本号,否则会错过后续 CVE 更新。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行后,
composer.json中会出现"roave/security-advisories": "dev-latest"在require-dev下 - 该包自身无代码,只有
composer.json中的conflict字段,所以不会增加运行时开销 - 如果项目已有
minimum-stability设为stable,需确认prefer-stable: true不会压制dev-latest解析——实际不影响,Composer 2+ 已优化此场景
composer update 报错 “found conflicting packages” 怎么办
这是预期行为,说明它起作用了。错误信息类似:
Because roave/security-advisories conflicts with monolog/monolog[1.25.0], monolog/monolog[1.25.0] is not allowed.
此时不能删掉 roave/security-advisories 来绕过,而应定位并升级/替换冲突包:
- 用
composer why monolog/monolog查清谁依赖了这个危险版本 - 尝试
composer update monolog/monolog:^2.0(假设新版已修复) - 若上游包(如某个老旧 SDK)强制依赖脆弱版本,需 fork 修复或联系作者;临时方案是加
--ignore-platform-reqs(不推荐)或在config.platform中伪造版本(仅测试环境) - 某些包被标记为“完全不安全”(如
phpunit/phpunit:4.8.*),只能彻底移除或升级到 9+
CI/CD 中启用时要注意的兼容性陷阱
在 GitHub Actions、GitLab CI 等环境中,roave/security-advisories 可能因缓存或并发导致误报或漏检:
- 务必在
composer install前运行composer clear-cache,避免本地缓存污染影响冲突判断 - 若使用
--no-interaction --no-progress,错误仍会以非零退出码返回,但日志可能被折叠——建议加--verbose或捕获 stderr 输出 - 某些私有仓库或 Satis 镜像未同步 Roave 的
dev-latest元数据,会导致composer require失败;此时可改用固定 SHA(如roave/security-advisories:dev-master#abc123),但需定期手动更新
真正难的是当多个间接依赖共同拉入同一个有漏洞的包时,Composer 冲突提示可能不够直观——这时候得靠 composer depends --tree 一层层翻,而不是指望一个包解决所有问题。

















