composer audit 是 Composer 2.5.0+ 内置命令,需先验证版本(composer --version ≥ 2.5.0)和功能加载(composer list | grep audit),它仅比对 composer.lock 中精确版本与 FriendsOfPHP 安全数据库,不扫描代码、NVD 或私有包,结果为空或无输出多因 lock 文件缺失、版本不匹配、fork 包未收录或 dev 标识被跳过。

composer audit 是唯一官方支持的依赖安全分析命令,但它只在 Composer 2.5.0+ 中可用,且默认不启用——直接运行大概率报 Command "audit" is not defined 或静默无输出。
怎么确认 composer audit 能用
别猜,先验证:
- 运行
composer --version:必须是2.5.0或更高;2.4.x及更低版本根本不含该命令 - 运行
composer list | grep audit:没输出 = 功能未就绪(不是拼写错,是压根没加载) - 若版本达标但仍不可用,检查是否启用了实验特性:
composer config --global experimental.audit true - 企业 CI 镜像常锁定旧版 Composer,
composer self-update可能失败——得换基础镜像或手动下载composer.phar
为什么 composer audit 扫不出已知漏洞
它不扫描代码、不连 NVD、也不看你的 PHP 版本或配置,只做一件事:比对 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掉、或内容损坏 → audit 无输入,结果为空 - 你手动复制了
vendor/,没走composer install→ lock 文件里的哈希与实际文件不匹配,audit 跳过校验 - 包名是 fork 版(如
myorg/guzzle),而数据库只认guzzlehttp/guzzle→ 直接忽略,不报错也不提示 - 版本带
-dev、dev-main等不稳定标识 → advisories 不收录,audit 主动跳过 - 用了私有仓库但没在
composer.json的repositories里声明security-advisories元数据 → 不参与扫描
CI 流水线里怎么让 composer audit 真正起作用
默认行为在 CI 里几乎必然失败:只要发现任意一条 advisory(包括 5 年前的 low 级条目),就返回非零退出码。这不是 bug,是设计如此——但你不该让它这么跑。
- 强制刷新远程数据、避免缓存干扰:
composer audit --force --no-interaction --timeout=30 - 生产环境只扫运行时依赖:
--no-dev;CI 测试链需评估开发工具风险,才加--dev - 聚焦真实风险,不被噪音淹没:
--severity=high --severity=critical(注意:不支持medium或low作为中断条件) - 结构化输出供脚本处理:
composer audit --format=json,再用jq '.advisories | length'提取数量,而非依赖退出码判断 - 网络受限时,先切回官方源:
composer config --global repo.packagist.org composer https://packagist.org
扫出来漏洞后,composer update 为什么不动
因为 composer update 只管版本约束,不管安全状态。它不会主动把 "monolog/monolog": "^2.0" 升到修复版,除非那个修复版恰好落在 ^2.0 范围内。
- 真正有效的动作是:查
composer audit报出的CVE对应的fixed in版本,再手动改composer.json中的约束,比如从"^2.0"改成"^2.10.0" - 运行
composer update monolog/monolog --with-all-dependencies确保依赖树同步更新 - 别信
composer outdated --security:它依赖插件,且只查可升级路径,不反映当前 lock 文件是否已含漏洞版本 - audit 报了
CVE-2023-XXXX,但你代码根本没调相关类?这很常见——它不分析调用链,只比对版本。是否要升级,得人工评估利用路径和上下文
最易被忽略的一点:audit 结果为 “No security advisories found” 时,不代表安全。它只说明 FriendsOfPHP 数据库里没有匹配项——而这个数据库覆盖有限,不包含大量小众包、私有包、或刚披露尚未同步的 0day。生产环境必须搭配 Snyk 或 OSS Index 补位,且不能跳过对 platform 配置(如 PHP 版本、扩展)的独立校验。

















