composer audit可用需同时满足三条件:composer≥2.5.0、全局启用experimental.audit、项目存在有效composer.lock;否则报错或静默失效,且仅比对lock文件精确版本与friendsofphp安全数据库。

composer audit 能用,但不是装完 Composer 就能直接跑 —— 它只在 Composer ≥ 2.5.0 中存在,且默认禁用,不满足条件时要么报 Command "audit" is not defined,要么静默无输出。
怎么确认 composer audit 真的能跑
别猜版本、别试插件,直接验证三件事:
- 运行
composer --version:必须输出类似Composer version 2.5.12;2.4.x及更低版本压根没这个命令 - 运行
composer list | grep audit:没输出 = 命令未加载,不是拼错,是根本没注册进来 - 若前两项都 OK 但仍无效,执行
composer config --global experimental.audit true—— 该配置写入全局auth.json,之后才真正启用扫描逻辑
某些定制镜像(如锁定 PHP 7.2 的旧版 Docker 镜像)可能编译时剔除了审计模块,self-update 会失败,只能换官方 composer.phar 或基础镜像。
composer audit 扫的是 composer.lock,不是 vendor/
它完全不读 composer.json,也不看 vendor/ 目录里实际有什么文件,只依赖 composer.lock 中记录的精确版本号 + dist.shasum 值去比对 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/或git clone进来,没走composer install→lock文件里的哈希与实际文件不匹配,audit主动跳过校验 - 用了 fork 包(如
myorg/guzzle),而数据库只认guzzlehttp/guzzle→ 不匹配,不告警也不提示 - 版本带
-dev、dev-main等不稳定标识 → advisories 不收录,audit主动跳过
CI 流水线里怎么避免 composer audit 误杀
默认行为是:只要发现任意一条 advisory(哪怕 5 年前的 low 级条目),就返回非零退出码。这不是 bug,是设计如此,但你不该让它这么跑。
- 生产卡点只关注真正可利用的风险:
composer audit --severity=critical --severity=high --no-dev - 网络不稳定时防卡住:
composer audit --no-interaction --timeout=30 - 结果要供脚本解析:
composer audit --format=json --no-dev --severity=high --severity=critical,再用jq '.advisories | length == 0'判断是否通过 - 想忽略已知可控漏洞(慎用):
composer audit --ignore=CVE-2023-12345
为什么扫出来有漏洞却不知道怎么修
composer audit 不自动修复,也不告诉你哪行代码触发了漏洞。它只报告“这个包 + 这个版本”被安全数据库标记过。
- 它不分析调用链:报告了
CVE-2023-12345,但你代码里根本没调用相关方法 → 风险可能为零,需人工评估 - 它不判断运行环境:有些漏洞只在
debug=true或特定 SAPI 下触发,audit不管这些 - 升级不是
composer update就完事:比如"guzzlehttp/guzzle": "^7.0"锁在7.2.0,而修复版是7.5.0,但7.5.0不在^7.0范围内 → 你需要手动composer update guzzlehttp/guzzle或放宽约束
真正容易被忽略的是:它只覆盖 FriendsOfPHP/security-advisories 这个社区数据库,小众包、私有包、未提交到 Packagist 的 fork,基本不在它的视野里 —— 这部分风险得靠其他工具补位。










