composer audit 仅检查 composer.lock 中已安装包是否在 Packagist 安全通告库中登记,不分析代码、私有包、未同步 CVE、PHP 配置或过时无漏洞版本;需配合 SCA 工具与人工审查保障安全。

Composer 本身不提供内置的漏洞扫描能力,composer audit 是 Composer 2.5+ 引入的命令,但它**依赖外部服务(packagist.org 的安全通告数据库)**,不是本地静态分析工具,也不能替代 SCA(软件成分分析)方案。
composer audit 命令能查什么、不能查什么
composer audit 仅检查 composer.lock 中已安装的包版本是否出现在 Packagist 公开维护的安全通告列表里(即 composer/security-advisories 的镜像)。它不会:
- 分析你自己的代码是否存在漏洞利用路径
- 检测未在 Packagist 安全库中登记的漏洞(比如私有包、新披露未同步的 CVE)
- 检查 PHP 配置、扩展或系统级风险
- 识别过时但无已知漏洞的版本(它只报“已确认有安全问题”的版本)
如何正确运行 audit 并理解输出
确保你用的是 Composer 2.5 或更高版本:
composer --version若低于此版本,先升级:
composer self-update然后执行审计:
composer audit
常见输出含义:
-
Found 2 package(s) with known vulnerabilities:表示 lock 文件里有匹配到安全通告的包 -
Package guzzlehttp/guzzle has a known vulnerability: CVE-2023-29197:给出具体包名、CVE 编号(若有)和简要描述 -
No known vulnerabilities detected:当前 lock 中所有包暂未被 Packagist 安全库标记
注意:composer audit --format=json 可用于 CI 环境解析;加 --locked 强制只检查 lock 文件(默认行为),避免误读 composer.json 中未安装的版本。
audit 失效的典型场景与应对
以下情况会导致 composer audit 漏报或无响应:
- 项目使用了私有仓库(如 Satis、Private Packagist),而该仓库未同步 Packagist 的安全通告
-
composer.lock被手动修改或未提交,导致实际运行环境与审计结果不一致 - 漏洞刚披露,Packagist 安全库尚未收录(通常延迟几小时到一两天)
- 你依赖的包是通过
path类型仓库引入的本地目录,audit 默认跳过这类包
此时应补充手段:php -d extension=ast.so vendor/bin/roave-security-advisories(需安装 Roave 包)、或接入 snyk test、dependabot、ossaudit 等第三方 SCA 工具。
audit 不是安全终点,只是第一道轻量过滤
它快、零配置、适合开发机日常快速筛查,但生产环境上线前必须结合其他措施:定期更新依赖、限制 minimum-stability、禁用 allow-plugins 未经审核的插件、审查 composer.json 中的 scripts 是否执行不可信命令。真正危险的从来不是已知 CVE,而是你不知道自己依赖了什么——composer show --tree 和 composer outdated --direct 往往比 audit 更早暴露风险面。










