Composer audit 明确检测已知漏洞,需 Composer ≥2.5.0、有效 composer.lock 和可访问的安全通告源;版本过低、镜像不支持或配置缺失会导致命令不可用或结果为空,并不等于绝对安全。

Composer 提示包不安全,不是警告你“可能有问题”,而是明确告诉你:当前 composer.lock 中某个已安装包的版本,已被 Packagist 官方安全数据库标记为存在已知漏洞(CVE 或供应链风险)。它不猜测、不推断,只比对——前提是你的环境满足三个硬性条件:Composer ≥ 2.5.0、composer.lock 存在且准确、能访问安全通告源。
composer audit 报 “Command not defined” 怎么办
这不是配置错、镜像没切、权限不够,纯粹是版本太低。2.4.x 及更早版本根本没这个命令。
- 运行
composer --version,输出是2.4.9或更低 → 必须升级 - 执行
composer self-update;若失败,说明被企业策略锁定或权限不足,改用官方脚本重装 - 升级后仍不见
audit,运行composer config --global experimental.audit true启用实验特性(某些定制版 phar 默认关闭) - 验证是否生效:
composer list | grep audit能输出一行才真正可用
audit 扫描结果为空或“no advisories found” 是不是就安全了
不是。空输出只代表:当前 composer.lock 中所有包的精确版本,未被 Packagist 的 security-advisories 数据库收录为已知风险项。这和“绝对安全”之间差着三道坎。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
composer.lock过期:你改了composer.json但没跑composer install,audit 读的是旧版本,漏报必然发生 - 私有包或 fork 包未进数据库:比如你内部 patch 的
guzzlehttp/guzzle修复了 CVE,但 Packagist 不知道,audit 就不会告警 - 零日漏洞尚未同步:FriendsOfPHP 数据库平均滞后 12–72 小时,刚披露的漏洞 audit 查不到
- 镜像源不支持
/advisories接口:比如用了 Satis 镜像但没手动放advisories.json,或 packagist-mirror 启动时没加--with-advisories,就会静默跳过远程检查
CI 流水线里 audit 总失败,怎么调成可用状态
默认策略太激进:只要发现任意一条 advisory(哪怕 severity 是 low),就返回非零退出码,直接中断构建。这不是 bug,是设计如此,但你不该让它这么跑。
- 加
--severity=critical,high:只对高危问题失败,避免被历史 low 级条目拖垮发布节奏 - 加
--no-dev:生产环境无需扫描require-dev,否则 PHPUnit 插件里的漏洞也会触发失败 - 必须搭配
--format=json:人类可读格式无法被 CI 解析,结构化输出才能用jq '.advisories[] | select(.severity == "critical")'提取关键项 - 禁用网络交互:
COMPOSER_NO_INTERACTION=1 COMPOSER_DISABLE_NETWORK=1,否则插件 fallback 会偷偷联网,破坏审计确定性 - 锁定数据源:
--advisories-url https://mirror.internal/sec-advisories-20260615.json,用你托管的静态快照,避免不同时间点扫描结果不一致
用了国内镜像,audit 却提示 “Could not fetch advisories”
主流公开镜像(阿里云、腾讯云、华为云)均不转发 Packagist 原始响应中的 signature 字段,也不暴露 /advisories 接口。你配了镜像,audit 就找不到通告源。
- 临时验证:运行
composer config --global repo.packagist composer https://packagist.org切回官方源,再试composer audit—— 若成功,问题就在镜像 - 私有镜像需显式支持:Satis 需在
web/目录下手动放advisories.json,并确保 Nginx 返回application/jsonMIME 类型 - packagist-mirror 启动时必须加
--with-advisories参数,且数据库字段要完整(缺advisory_id或published_at会导致解析失败) - 自定义通告必须含
affected字段,格式严格为{"name": "vendor/package", "version": ">=1.0.0"},多一个空格或引号都会被忽略
真正麻烦的从来不是命令怎么敲,而是 audit 查不到的部分:私有包没通告、零日漏洞还没入库、PHP 版本兼容性没校验、间接依赖是否实际被调用也无从判断。这些都得靠人工交叉核对,不能只盯着那一行 green output。

















