composer audit 命令仅在 Composer 2.5.0+ 可用且需显式启用,依赖 composer.lock 中的精确包信息与 FriendsOfPHP 安全数据库匹配,不扫描 dev 分支或私有包,CI 中需用 --severity=high/critical 和 --no-dev 控制退出逻辑。

composer audit 不是“一运行就出结果”的命令,它在 Composer 2.5.0+ 才存在,且默认不启用——直接执行大概率报 Command "audit" is not defined 或静默无输出。别猜原因,先验证三件事:版本、命令加载状态、实验配置。
为什么 composer audit 命令不存在或没反应
这不是镜像源、权限或插件问题,而是底层功能缺失。常见情况有三个:
- Composer 版本低于 2.5.0:运行
composer --version,若输出为2.4.x或更低,audit根本不存在;必须执行composer self-update - 版本 ≥ 2.5.0 但命令未加载:运行
composer list | grep audit,无输出说明模块未注册;此时需显式启用:composer config --global experimental.audit true(该配置写入全局auth.json) - 用了定制版
composer.phar(如某些 Docker 镜像):审计模块被裁剪,self-update可能失败;只能换官方完整版或重装
composer audit 扫的是 composer.lock,不是 vendor/
它完全不读 composer.json 的版本约束(如 "^3.0"),也不检查 vendor/ 目录里实际有什么文件。唯一依据是 composer.lock 中记录的精确包名、版本号和 dist.shasum。
-
composer.lock缺失、为空、被.gitignore忽略,或哈希与vendor/不匹配 →audit跳过校验,结果为空 - 你改了
composer.json但没跑composer install→ 锁文件没更新,audit不会反映潜在风险 - 私有包未在
composer.json的repositories中声明,或其元数据不含security-advisories字段 → 默认不扫描 - 版本含
dev-main、dev-feature/x等开发分支标识 →audit主动跳过(安全数据库不收录 dev 分支)
CI 流水线里 composer audit 总失败?别让它默认行为毁掉构建
默认行为是:只要发现任意一条 advisory(哪怕是个 5 年前的 low 级 CVE),就返回非零退出码。这不是 bug,是设计如此——但你不该照单全收。
- 加
--no-dev:排除require-dev里的 PHPUnit、PHPStan 等工具链干扰 - 只卡真正可利用的风险:
--severity=high --severity=critical(注意:--severity=medium无效) - 结构化输出供脚本判断:
composer audit --format=json --no-dev --severity=high --severity=critical,再用jq '.advisories | length == 0'判断是否通过 - 网络不稳定时加
--no-interaction --timeout=30,防卡住;企业内网若屏蔽packagist.org,需确认镜像源是否同步安全数据库
发现漏洞后,为什么 composer update 不自动修复?
因为 Composer 不感知“安全状态”,它只忠实地满足 composer.json 中的版本约束。即使某个包有 CVE,只要当前安装版本落在 "monolog/monolog": "^2.0" 范围内,composer update 就不会升级到修复版。
- 手动修复方式:明确指定安全版本,如
composer update monolog/monolog:^2.10.0 - 或编辑
composer.json,收紧版本约束后执行composer update --lock -
roave/security-advisories不是扫描器,它是通过conflict规则阻止安装已知漏洞包,适合预防而非检测 - 若
composer audit查不到已知 CVE,很可能是 FriendsOfPHP 安全数据库未覆盖该条目;此时需补位第三方工具,如snyk test --file=composer.lock --severity-threshold=high
真正容易被忽略的点是:锁文件哈希校验和数据库覆盖范围。前者决定它“看不看得见”,后者决定它“认不认识”——两者都准,audit 才算真正生效。


















