composer audit命令需同时满足三前提:Composer≥2.5.0、存在有效composer.lock、可访问Packagist安全接口;它仅报告风险不修复,且默认跳过私有源、dev分支及require-dev包,须显式配置才覆盖全链路。

composer.lock 文件本身没有漏洞,但它是安全审查的唯一可信依据——漏掉它,audit 就等于没跑。
composer audit 命令为什么没输出或报错
不是镜像慢、也不是权限问题,而是三个硬性前提没满足:
-
composer --version必须 ≥ 2.5.0;低于这个版本会直接报Command "audit" is not defined -
composer.lock必须存在且内容完整(不能被.gitignore忽略,也不能是空文件或哈希与vendor/不一致) - 网络必须能访问
https://packagist.org的安全接口;国内镜像(如阿里云、腾讯云)默认不同步security-advisories数据,切回官方源:composer config --global repo.packagist.org composer https://packagist.org
执行 composer list | grep audit 没结果?说明实验特性未启用:composer config --global experimental.audit true。
私有包、fork 包、path 本地依赖为什么扫不出来
audit 默认跳过所有非 Packagist 官方源的包,哪怕你写了 repositories,也不代表它会被审计。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 必须显式声明
"type": "composer",写成"type": "vcs"或留空都无效 - 仓库 URL 末尾必须带斜杠,比如
"https://satis.example.com/",否则请求packages.json会 404 - 必须同级设
"packagist.org": false,否则 Composer 优先查官方源,你的私有包永远进不了审计流程 - 更关键的是:私有包的安全通告得手动注入到其
packages.json中,字段名必须是security-advisories,格式严格对齐 FriendsOfPHP/schema
dev 分支(如 dev-main、dev-feature/x)也会被 audit 主动跳过——安全数据库不收录 dev 版本。
CI 流水线里 audit 总失败或漏报
默认行为太激进:只要发现任意一条 advisory(包括 5 年前的 low 级 CVE),就返回非零退出码;而默认又不扫 require-dev,phpunit/mockery 这类开发链路漏洞全被绕过。
- 生产卡点只关注真实可利用风险:
composer audit --severity=critical --severity=high --no-dev - CI 中必须加
--dev才能覆盖测试工具链:composer audit --dev --no-interaction --timeout=30 - 结构化输出供脚本判断:
composer audit --format=json --no-dev | jq '.advisories | length',用返回数字做阈值控制 - 别信 “No security vulnerability detected” —— 它只代表没匹配到已知条目,不代表安全;小众包、新披露 CVE、私有包无元数据时,audit 静默跳过是常态
audit 发现了漏洞,下一步怎么做
audit 不升级、不降级、不改 composer.json,它只是个“安检仪”,不是“维修工”。
- 修复动作仍是手动:
composer update vendor/package或锁死小版本:composer update monolog/monolog:^2.9 - 如果当前约束太宽(如
"monolog/monolog": "^2.0"),update 可能升到带漏洞的 2.8.0;建议高风险插件固定小版本号,例如"monolog/monolog": "2.10.0" - 忽略漏洞必须留痕:
composer audit --ignore=CVE-2023-12345可用,但必须在代码注释或文档里写明豁免理由和临时缓解措施 - audit 不校验 PHP 平台兼容性;CI 中应紧接运行
composer validate --strict,防止因config.platform错配导致部署崩溃
真正容易被忽略的是:audit 结果依赖 Packagist 安全数据库的覆盖范围,它不是 NVD,不保证收录全部 CVE。对关键依赖,得人工查 GitHub SECURITY.md、最近 commit 活跃度、maintainer 响应速度——工具只负责提醒,判断还得靠人。

















