composer audit 命令需满足四条件才有效:版本≥2.5.0且启用experimental.audit;composer.lock存在、非空、未被忽略且与vendor一致;能访问packagist.org/advisories;漏洞存在于FriendsOfPHP安全数据库中。

composer audit 命令是否存在
运行 composer list | grep audit,有输出才说明命令已注册。如果没结果,不是拼写错了,也不是网络或权限问题——是功能根本没加载。常见原因有两个:composer --version 输出低于 2.5.0;或者版本达标但实验特性未启用。前者必须先执行 composer self-update,后者需手动开启:composer config --global experimental.audit true,该配置会写入 ~/.composer/auth.json。
composer.lock 文件是否被 audit 识别
composer audit 只读 composer.lock,不看 composer.json 的约束,也不扫描 vendor/ 目录。以下任一情况都会导致它静默跳过、无输出、返回成功码(0)但实际没扫描:
-
composer.lock不存在、为空、或被.gitignore屏蔽 -
composer.lock存在但哈希值与当前vendor/不一致(比如手动删了 vendor 后没重装) - 锁文件里含
dev-main、dev-feature/x这类开发分支标识——audit 主动跳过,因为安全数据库不收录 dev 版本 - 改了
composer.json却没运行composer install或composer update,锁文件仍是旧的
能否连上 Packagist 安全数据库
audit 依赖从 https://packagist.org/advisories 拉取数据。企业环境常因代理、防火墙或镜像源配置失败。验证方式很简单:
- 执行
curl -I https://packagist.org/advisories,看到HTTP/2 200才算通 - 若返回超时或
403,临时切回官方源:composer config --global repo.packagist.org composer https://packagist.org - 国内镜像(如阿里云、腾讯云)大多不同步
security-advisories接口,别指望它们能支撑 audit - 错误信息如
Could not fetch advisories: cURL error 7就是典型网络不通
输出是否真包含有效漏洞数据
执行 composer audit --format=json --no-dev,再用 jq '.advisories | length' 查数组长度。如果输出 0,但你知道项目用了带已知 CVE 的旧版 monolog/monolog,大概率是:
- 私有包没在
composer.json的repositories中声明,或其元数据不含security-advisories兼容字段 - 漏洞不在 FriendsOfPHP 安全数据库里——它只收 Symfony/Drupal/Laravel 等主流生态确认过的条目,小众包或新披露未同步的 CVE 就查不到
- 你正在用定制版
composer.phar(某些旧 Docker 镜像),审计模块被裁剪,self-update也无效,只能换官方完整版


















