composer outdated --security-only 并非漏洞扫描器,它仅筛选Packagist已标记CVE修复版本的包;真正检测已安装版本是否含CVE需用composer audit(≥2.5.0),后者直连php-security-advisories数据库比对composer.lock中实际版本。

composer outdated 本身不查 CVE,也完全不接触安全数据库——它只比对版本号,不是漏洞扫描器。
为什么 composer outdated --security-only 看起来像在查漏洞?
这个参数(Composer 2.2+)确实会列出含 CVE 修复的包,但它不是在“扫描漏洞”,而是在 Packagist 上查「哪些已发布版本被官方标记为 security fix」。前提是:该包的维护者已向 Packagist 提交了安全通告,并关联了 CVE 编号和修复版本。
- 它不检查你当前安装的版本是否真有漏洞,只检查「有没有一个满足你约束的新版,恰好是某个 CVE 的修复版」
- 如果某包有 CVE,但修复版未发布、或未打标签、或没提交到 Packagist 安全库,
composer outdated --security-only就不会显示它 - 输出里没有 CVE 编号、严重等级或受影响函数,只有包名和版本号 → 无法判断风险上下文
真正该用的命令是 composer audit
composer audit(≥2.5.0)才是专为 CVE 设计的命令,它直接查询 php-security-advisories 数据库,比对的是 composer.lock 中**实际安装的版本**,而非“理论上能升到哪”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 输出带
CVE-2023-XXXXX、critical/high标签、影响范围描述 - 加
--no-dev可跳过 phpunit、phpstan 等开发依赖(生产环境推荐) - 加
--format=json输出结构化数据,适合 CI 解析;加--fail-on-security-violations可让构建失败 - 它不依赖你是否写了
"^2.0"这类约束——哪怕你锁死"2.3.0",只要该版本在 CVE 库中被标记,audit 就会报出来
常见误操作和对应后果
把 composer outdated --security-only 当作安全兜底,是 PHP 项目最常踩的盲区之一。
- 运行
composer outdated --security-only没输出,就认为“没漏洞” → 实际可能只是 CVE 还没入库,或包没被主流生态收录 - 只在本地跑
outdated,CI 里漏掉audit→ 构建通过但上线即带高危漏洞(比如guzzlehttp/guzzle的 DNS 重绑定问题) - 没确认 Composer 版本就执行
audit→Command "audit" is not defined报错,误以为功能失效 - 忽略
--force参数 → CI 中用缓存旧数据,漏掉刚发布的 CVE 补丁(尤其私有镜像源同步延迟时)
安全更新永远不是“升到最新版”就行,而是先确认当前装的版本是否在已知漏洞列表中,再决定升、换、还是隔离调用路径。audit 是这一步不可绕过的起点,outdated 只负责告诉你“升了能到哪”。

















