composer audit 需满足三条件才真正可用:composer ≥ 2.5.0、全局启用 experimental.audit、项目存在有效 composer.lock;否则静默失败或报错,不表示安全。

composer audit 不是“开了就能用”的命令,它默认不启用、不扫开发依赖、不查私有包、也不校验 PHP 版本兼容性。单靠它跑一次就认为项目安全,等于把漏洞藏在盲区里。
怎么确认 composer audit 真的能用
别试了再看报错,先验证三件事:
-
composer --version必须 ≥ 2.5.0;2.4.x 或更低版本压根没这个命令 -
composer list | grep audit要有输出;没输出说明功能未加载,不是拼写问题 -
composer config --global experimental.audit true必须执行过——该配置写入全局auth.json,否则命令静默无响应
CI 镜像常锁死旧版 Composer,composer self-update 可能失败,这时得换基础镜像或手动下载完整版 composer.phar。
composer audit 扫不出漏洞的常见原因
它只比对 composer.lock 里的精确包名 + 精确版本号,和 FriendsOfPHP/security-advisories 数据库是否匹配。漏报基本都来自这几点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer.lock缺失、被.gitignore掉、或哈希值与vendor/不一致 → audit 拒绝扫描 - 包名是 fork 的(如
myorg/guzzle),而数据库只认guzzlehttp/guzzle→ 直接跳过,不报错也不提示 - 版本含
-dev、dev-main或dev-feature/x→ advisories 不收录 dev 分支,audit 主动忽略 - 用了私有仓库但没在
composer.json的repositories里声明security-advisories元数据 → 默认不参与 - 网络不通,拉不到
https://packagist.org/advisories→ 报Could not fetch security advisories
CI 流水线里怎么让 composer audit 真正起作用
默认行为在 CI 中几乎必然失败:只要发现任意一条 advisory(包括 5 年前的 low 级条目),就返回非零退出码。这不是 bug,是设计如此,但你不该让它这么跑。
- 必须加
--dev:否则phpunit/phpunit、mockery/mockery这类测试链漏洞全被豁免 - 加
--no-interaction --timeout=30:避免交互中断流水线,也防内网 DNS 卡住 - 聚焦真实风险:
--severity=high --severity=critical(注意不支持medium或low) - 输出结构化:
--format=json,然后解析advisories_count字段——这才是真实漏洞数,别信终端颜色渲染或截断后的 “No advisories found”
为什么不能只靠 composer audit 做依赖审查
它只管已知 CVE,不管平台兼容性、代码调用路径、私有逻辑或运行时配置。几个关键盲区必须人工补位:
-
composer validate --strict必须并行跑:audit 完全不校验"platform": {"php": "8.2"}是否与依赖最新版冲突,而validate会报错 - 私有包和 fork 包要手动查 GitHub/GitLab 的
SECURITY.md或 issue 标签,关注最近 commit 和 maintainer 活跃度 -
composer outdated --all得配合用:audit 不告诉你哪个包卡在旧 patch 版本(比如guzzlehttp/guzzle停在 7.2.0,而 7.5.1 已修复CVE-2023-41277) - 对核心间接依赖(如
psr/log、symfony/polyfill-*),建议用snyk test --file=composer.lock --severity-threshold=high补扫——它覆盖 NVD 和 GitHub Advisories,比 audit 多一层保障
真正容易被忽略的是:audit 的沉默,常常只是数据库没收录,不是漏洞不存在。










