composer 2.5+ 内置 composer audit 命令可扫描 composer.lock 中已安装包的已知安全漏洞,需先升级至 ≥2.5.0 版本(否则报“command 'audit' is not defined”),默认检查全部依赖(含 dev),支持 --no-dev、--format=json、--fail-on-security-violations 等参数用于生产环境与 ci 集成。

直接用 composer audit,但前提是 Composer 版本 ≥ 2.5.0 —— 低于这个版本会报错 Command "audit" is not defined,不是命令写错了,是根本没这个功能。
确认并升级 Composer 到 2.5+
运行 composer --version 看输出。如果显示 Composer version 2.4.x 或更低,composer audit 就不可用。
- 执行
composer self-update升级(需对 Composer 二进制有写权限) - 若失败,改用官方安装方式重装:
curl -sS https://getcomposer.org/installer | php && sudo mv composer.phar /usr/local/bin/composer - 升级后再次运行
composer --version验证是否 ≥ 2.5.0
composer audit 默认行为和常见误判点
它只读 composer.lock 中**实际安装的版本**,不看 composer.json 里写的约束(比如你写了 "guzzlehttp/guzzle": "^7.0",但 lock 文件里锁的是 7.2.0,audit 检的就是 7.2.0)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 默认扫描全部已安装包,包括
require-dev中的开发依赖 - 生产环境建议加
--no-dev,避免把 PHPUnit、PHPStan 这类仅构建期使用的漏洞当成线上风险 - 输出为空 ≠ 没漏洞,可能是 PHP-SECADV 数据库尚未收录该 CVE —— 别依赖它发现全部问题
- 它不查源码、不跑时分析、不检测配置错误,纯靠比对公开安全通告
让结果可集成、可卡点:JSON 输出与 CI 可用参数
自动化流程中别依赖人眼扫终端输出,用结构化格式处理更稳。
-
composer audit --format=json:标准 JSON,字段含advisory、severity、package、version等,适合脚本解析 -
composer audit --fail-on-security-violations:遇到中危及以上漏洞直接返回非零退出码,CI 流水线可据此中断构建 -
composer audit --ignore-severity=low:跳过低危项,聚焦真正要处理的问题(critical/ high/ medium) - 注意:
--force强制跳过本地缓存,每次查远程数据库,适合 CI;本地开发用默认缓存即可
发现漏洞后,为什么 composer update 不自动修复?
因为 Composer 不感知“安全状态”,它只忠实地满足 composer.json 中的版本约束。即使某个包 1.2.0 有 CVE,而 1.3.0 已修复,但你的 require 写的是 "foo/bar": "~1.0",那 composer update foo/bar 可能只会升到 1.2.9 —— 只要还在 ~1.0 范围内,就合法,哪怕带漏洞。
- 先看当前版本:
composer show foo/bar - 查哪些版本可用且修复了漏洞:
composer outdated --security(Composer 2.5+ 支持) - 手动指定目标版本升级:
composer update foo/bar:^1.3.0 --with-all-dependencies - 升级后务必重新运行
composer audit验证,别假设“update 了就没事”
最常被忽略的一点:audit 报出来的包,可能早已停止维护(abandoned)。这时候光升级没用,得换替代方案,比如把 monolog/monolog v1 换成 v3,或把弃用的 swiftmailer/swiftmailer 迁移到 symfony/mailer。










