composer audit 不默认启用,需 composer 2.5.0+、存在完整 composer.lock、首次运行需联网下载 symfony 安全数据库;漏洞仅来自 symfony security advisory database,覆盖主流 php 包,分级为 low/medium/high/critical,含 cve id 和描述。

composer audit 是 Composer 2.5+ 内置的安全漏洞扫描命令,能快速检查已安装依赖是否存在已知 CVE 漏洞。它不自动修复,只报告;若你用的是 Composer 2.4 或更早版本,该命令根本不存在——会直接报错 Command "audit" is not defined.。
composer audit 命令是否默认启用?需要额外配置吗?
不需要额外配置,但有前提:
- 必须使用
Composer 2.5.0+(运行composer --version确认) -
composer.lock文件必须存在且完整(不能只靠vendor/目录) - 首次运行会自动下载并缓存 PHP Security Advisory Database(约数 MB),需联网
- 不读取
composer.json中的require-dev以外的 dev 依赖,除非显式加--dev参数
audit 报告的漏洞等级和来源是什么?
漏洞数据来自 Symfony Security Advisory Database,不是 NVD 或 GitHub Advisory。这意味着:
- 只覆盖 Symfony 官方审核过的 PHP 包(如 monolog/monolog、laravel/framework、doctrine/* 等主流库)
- 不包含未被该数据库收录的包(例如私有包、小众 fork、纯前端 JS 包)
- 严重等级分
low/medium/high/critical,但无 CVSS 分数 - 每条结果带 CVE ID(如
CVE-2023-1234)和简短描述,点击链接可跳转到 symfony.com 查看详情
怎么用 audit 扫描特定包或忽略误报?
基础扫描:composer audit(检查全部生产依赖)
常用变体:
- 只扫开发依赖:
composer audit --dev - 只扫某个包:
composer audit monolog/monolog - 输出 JSON 方便脚本解析:
composer audit --format=json - 静默模式(仅返回非零退出码):
composer audit --quiet,CI 中常用 - 忽略某条 CVE(不推荐,仅临时绕过):
composer audit --ignore=CVE-2023-1234
注意:--ignore 不写入任何配置文件,每次都要显式指定;它不会跳过整个包,只跳过匹配的 CVE ID。
audit 和第三方工具(如 safety、deps.dev)有什么区别?
核心差异在数据源与范围:
-
composer audit轻量、原生、快,但覆盖窄(仅 symfony db 收录的 PHP 包) -
safety(Python 工具)或deps.dev会查 NVD、GitHub Advisory、OSV 等多源,支持跨语言,但需额外安装、配置 API key、网络延迟高 -
composer outdated --security-only是旧版替代方案(Composer 2.4 及以前),功能弱、不更新、已弃用 - 真正关键的点是:audit 不检测本地代码漏洞、不分析 require 版本约束宽松性(如
"^1.0")、也不提示“该升级到哪个版本”——它只告诉你“当前 lock 里这个版本有已知问题”
如果你的项目用了大量非 Symfony 生态的包(比如自研组件、WordPress 插件、Laminas 子包),composer audit 很可能一无所获,别误以为“没报错=安全”。










