必须升级 composer 至 ≥2.5.0 才能使用 audit 命令,它依赖 composer.lock 中的精确版本号比对 friendsofphp 安全数据库,不解析 composer.json 或扫描 vendor,需配合 --no-dev、--severity、--format=json 等参数用于生产与 ci。

直接用 composer audit,但前提是 Composer 版本 ≥ 2.5.0 —— 低于这个版本会报错 Command "audit" is not defined,不是命令写错了,是根本没这个功能。
确认并升级 Composer 到 2.5+ 才能用 audit
Composer 的 audit 命令从 2.5.0 起才默认启用、稳定同步安全数据库;2.4.x 及更早版本压根没有这个命令。
- 运行
composer --version查当前版本,输出如Composer version 2.4.4就必须升级 - 执行
composer self-update(需对 Composer 二进制有写权限) - 若失败(常见于旧 PHP 环境或权限受限),改用官方安装方式:
curl -sS https://getcomposer.org/installer | php && sudo mv composer.phar /usr/local/bin/composer - 升级后务必再跑一次
composer --version和composer list | grep audit双验证
audit 只认 composer.lock,不看 composer.json 或 vendor/ 目录
它完全依赖 composer.lock 文件里记录的**精确版本号和哈希值**做比对,既不解析 composer.json 中的版本约束(比如 "monolog/monolog": "^3.0"),也不扫描 vendor/ 里实际文件内容。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(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就可能漏报甚至返回空结果 - 临时验证是否锁文件准确:删掉
vendor/和composer.lock,再执行composer install --no-interaction重建 - 私有包必须在
composer.json的repositories中显式声明,且其元数据需支持security-advisories字段,否则不参与扫描
让 audit 输出真正可用的结果
默认行为容易误判:扫全部依赖(含 require-dev)、报告所有级别漏洞、终端输出难解析。生产环境或 CI 中要主动控制。
- 加
--no-dev排除 PHPUnit、PHPStan 等开发依赖,聚焦线上风险 - 用
--severity=high --severity=critical限定只报高危及以上(medium和low不会中断命令) - CI 中别靠人眼扫终端,用
--format=json输出结构化数据,再配合jq提取关键字段:composer audit --format=json | jq '.advisories[] | select(.severity == "critical")' - 加
--fail-on-security-violations让中危及以上漏洞触发非零退出码,方便流水线卡点
audit 报“没漏洞” ≠ 真安全,报“有漏洞” ≠ 必须立刻升级
它的能力边界很明确:只比对 FriendsOfPHP/security-advisories 数据库中已收录的、精确匹配你 lock 文件里版本的条目,不分析代码调用路径、不查 NVD/CVE 原始库、不评估运行时配置影响。
- 输出为空,可能是漏洞尚未被该数据库收录,也可能是锁文件版本恰好对应已修复版(比如
symfony/http-foundation锁的是v5.4.23,而 CVE-XXXX 只影响v5.4.0) - 报告了
CVE-XXXX-XXXX并带"link"指向 NVD 页面,说明有公开 PoC,优先处理;若只有"severity": "medium"且无具体利用条件描述,建议记录但不必紧急升级 -
composer update不会自动修复漏洞,因为它只满足composer.json的版本约束 —— 即使foo/bar v1.3.0已修复 CVE,但你的require写的是"~1.0",update 可能只升到1.2.9
最常被忽略的一点:audit 的结果强依赖锁文件的时效性与准确性。项目长期没 run 过 composer update,lock 文件里全是老版本,audit 就只能告诉你“这些老版本里有哪些已知问题”,而不是“你现在用的代码有没有风险”。










