composer audit 是 composer 2.5+ 内置的安全审计命令,通过比对 packagist 的 security-advisories 数据库扫描 composer.lock 中的已知 cve;若提示“command ‘audit’ is not defined”,说明版本低于 2.5。

composer audit 查看项目整体安全漏洞
Composer 本身从 2.5 版本起内置了 composer audit 命令,这是目前最直接、无需额外插件的方式。它会扫描 composer.lock 中所有已安装包,比对 Packagist 官方维护的 security-advisories 数据库,返回已知 CVE 或高危问题。
常见错误现象:运行 composer audit 提示 “Command ‘audit’ is not defined”,说明 Composer 版本太低(composer self-update。
- 默认只报告中危及以上(
--low可包含低危) - 加
--format=json方便 CI 集成或脚本解析 - 不检查未 lock 的
composer.json依赖,只看实际安装的版本 - 部分私有包或 fork 仓库若不在 advisories 列表里,不会被识别
composer show --security 查看单个包的安全状态
composer show --security 是更聚焦的命令,适合排查某个具体包是否“踩雷”。它会列出该包及其所有依赖链上的已知漏洞,比 audit 更细,但必须指定包名。
使用场景:你刚升级了 monolog/monolog,不确定新版本是否修复了 CVE-2023-47242,就可以立刻查:
composer show --security monolog/monolog
注意点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须加包名,
composer show --security不带参数会报错 - 输出里 “Advisory” 字段对应 CVE 编号,“Affected versions” 明确标出哪些版本范围有风险
- 如果包本身没漏洞,但它的某个子依赖(如
symfony/polyfill-php81)有,也会列出来——别只盯着顶层包 - 这个命令不触发安装或更新,纯读取 lock 文件,安全
为什么 vendor/bin/local-php-security-checker 不推荐了
过去很多人用 local-php-security-checker(LPSC),但现在它已归档停更,且和 Composer 原生命令存在三处关键冲突:
- 它依赖本地缓存的旧版 advisories 数据,可能漏掉近半年新增的 CVE
- 对 PHP 8.2+ 和某些扩展(如
ext-pdo_sqlsrv)兼容性差,常报Class 'Symfony\Component\Yaml\Yaml' not found - 它扫描的是
vendor/目录结构,而 Composer 2.x 默认启用 plugin-api v2,导致 LPSC 加载失败 - 它无法识别
require-dev中仅用于测试的包是否真会影响线上——而composer audit默认跳过 dev-only 包,更贴近真实风险面
CI 环境中自动拦截高危包的写法
在 GitHub Actions 或 GitLab CI 里,不能只靠人工跑一次 audit。要让它真正起作用,得配合退出码和策略:
composer audit --no-dev --fail-on=high
说明:
-
--no-dev排除开发依赖,避免误伤(比如测试工具里的漏洞不影响生产) -
--fail-on=high表示遇到高危(high)及以上就返回非 0 状态,让 pipeline 失败 - 可选
--fail-on=medium,但 Medium 级别常有误报,建议先人工确认再收紧 - 务必确保 CI 使用的 Composer 是最新稳定版,否则
--fail-on参数不识别
最容易被忽略的一点:很多团队把 composer audit 放在 build 步骤之后,但其实它应该放在 install 之后、test 之前——因为有些漏洞只在特定 PHP 版本下触发,而 test 环境的 PHP 版本才决定实际风险暴露面。










