roave/security-advisories 是一个冲突声明包,仅通过 composer.json 的 conflict 字段标记已知漏洞版本,依赖 composer 冲突检测机制在 install/update 时主动拦截不安全依赖,须用 composer require --dev roave/security-advisories:dev-latest 引入,不可用语义化版本或直接 require。

roave/security-advisories 是什么,为什么不能直接 require
roave/security-advisories 不是一个功能库,而是一个“冲突声明包”。它本身不提供任何 PHP 类或函数,只在 composer.json 的 conflict 字段里列出已知存在安全漏洞的依赖版本范围。Composer 在安装或更新时会检查这些冲突,一旦发现你将要安装的某个包版本被明确标记为“有漏洞”,就会中止操作并报错。
所以你不能 composer require roave/security-advisories —— 它没有 autoload 配置,require 之后也起不了作用;正确做法是把它作为 require-dev(或 require)里的“元依赖”引入,靠 Composer 的冲突检测机制生效。
如何正确添加并启用它
执行以下命令即可完成接入:
composer require --dev roave/security-advisories:dev-latest
这条命令做了三件事:
- 把
roave/security-advisories加入require-dev - 用
dev-latest这个别名拉取最新快照(它指向一个不断更新的分支,不是固定版本) - 触发一次
composer update检查当前锁文件是否合规
如果项目里已有带漏洞的依赖(比如 monolog/monolog v1.23.0),此时 update 就会失败,并提示类似:
Your requirements could not be resolved to an installable set of packages.
Problem 1
- roave/security-advisories dev-latest conflicts with monolog/monolog[1.23.0].
这时你就得手动升级或替换那个包——这正是它的价值所在:把“运行时才发现漏洞”提前到“安装时就拦住”。
常见踩坑点:dev-latest vs 版本约束
别写成 composer require --dev roave/security-advisories:^2.0 或类似语义化版本——这个包不按常规方式发版,^2.0 实际指向的是早已冻结的老快照,漏掉大量近年新增的漏洞条目。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
必须坚持用 dev-latest,原因如下:
-
dev-latest是一个 Composer 别名,始终解析为该仓库 default 分支的最新 commit - 维护者每天同步 PHP Security Advisory Database,新漏洞入库后几小时内就能生效
- 如果你锁死某个具体版本(如
2.0.1),等于主动放弃后续所有安全更新
顺带一提:这个包默认不启用自动更新,所以每次 CI 构建或本地 composer install 时,它都基于你 composer.lock 里记录的 dev-latest 提交哈希做校验——只要 lock 文件没更新,就不会感知新漏洞。因此建议在 CI 中加一步 composer update roave/security-advisories --dry-run 来预警是否需要重锁。
它和 composer audit 的关系
composer audit(Composer 2.5+ 内置)也能报告漏洞,但它只是“扫描已安装项”,不阻止安装。而 roave/security-advisories 是“预防性拦截”,在 install/update 阶段就卡住流程。
两者不互斥,推荐共存:
- 用
roave/security-advisories守住 CI 和本地开发的入口 - 用
composer audit --fixed定期巡检历史遗留包(比如某些被conflict漏掉的间接依赖)
注意:audit 默认只查 packagist.org 上登记过的 CVE,而 roave 的数据源更广(包括私有包、未上报 CVE 的修复公告等),覆盖维度不同。
真正容易被忽略的是:这个包对 minimum-stability 敏感。如果你项目设了 "minimum-stability": "stable",而 roave/security-advisories:dev-latest 是 dev 分支,Composer 可能拒绝安装——此时需显式允许:"prefer-stable": true 不影响它,但要确保没加 "minimum-stability": "stable" 这种硬限制,或者临时加 --stability-flags roave/security-advisories=dev。










