不能。composer audit 仅比对 composer.lock 中已安装包与 Packagist 安全数据库(FriendsOfPHP/security-advisories)的已知漏洞,不扫描源码、不覆盖私有/开发依赖(除非加 --dev),且依赖 Composer ≥2.5.0、有效 lock 文件及网络连通性。

composer audit 命令能直接扫描已安装依赖的安全问题吗
不能。Composer 本身在 2.5 之前不内置安全审计功能,composer audit 是 Composer 2.5+ 新增的命令,但它默认只对接 Symfony Security Checker(该服务已于 2023 年底下线),且不支持本地 CVE 数据库离线扫描。实际运行 composer audit 很可能返回 Security advisories not available 或超时失败。
真正可用的方案是借助官方推荐的第三方工具:security-advisories 数据源 + roave/security-advisories 约束,或使用独立 CLI 工具 composer-security-checker(已归档)和当前主流替代品 phpstan-security 或更通用的 depcheck ——但最轻量、最贴合 Composer 生态的仍是 composer require --dev roave/security-advisories:dev-master 这种“编译期拦截”方式。
用 roave/security-advisories 实现安装时自动阻断高危包
这不是运行时扫描,而是通过 Composer 的冲突机制,在 composer install 或 composer update 阶段就拒绝解析含已知漏洞的版本。它依赖 Roave 安全通告包,该包将所有已知 PHP 包漏洞转为 conflict 规则,强制 Composer 解析器报错。
- 执行
composer require --dev roave/security-advisories:dev-master(注意:必须用dev-master,稳定版已停止更新) - 该包无实际代码,只含
composer.json中大量"conflict"条目,例如:"monolog/monolog": "=2.0.0 - 后续只要项目依赖了被标记的危险版本,Composer 就会中断并提示类似:
Your requirements could not be resolved to an installable set of packages.,并在冲突详情里指出哪个包、哪个版本被禁止 - CI 流程中只需保证
composer install成功,即等价于“通过安全检查”——无需额外脚本
需要运行时扫描?用 composer-audit 替代原生命令
社区维护的 composer-audit 是目前最接近“自动检查”的 CLI 工具,它基于 GitHub Advisory Database(GHSA)实时查询,支持 JSON 输出和退出码判断,适合集成进 CI/CD。
- 全局安装:
composer global require janmarek/composer-audit(确保~/.composer/vendor/bin在$PATH中) - 本地项目安装(推荐):
composer require --dev janmarek/composer-audit,然后用vendor/bin/composer-audit - 检查并返回非零退出码(CI 可用):
vendor/bin/composer-audit --fail-on-warn(警告即失败)或--fail-on-error(仅严重漏洞失败) - 注意:它扫描的是
composer.lock,不是vendor/目录,所以必须先composer install或composer update更新 lock 文件 - 不支持私有包或未公开披露的漏洞,且每次执行需网络请求——CI 中建议加缓存或设置超时
CI 脚本里怎么写才算可靠
别只跑一次命令就完事。真实环境要覆盖锁文件时效性、PHP 版本兼容、以及失败后快速定位。
- 先校验 lock 文件是否最新:
composer validate --strict+git diff --quiet composer.lock || (echo "composer.lock not up to date"; exit 1) - 用指定 PHP 版本运行(避免因 PHP 版本差异导致依赖解析不同):
php8.1 -d memory_limit=-1 $(which composer) install --no-progress --no-suggest - 再执行审计:
vendor/bin/composer-audit --format=github --fail-on-error(--format=github可让 GitHub Actions 自动注释问题行) - 如果用
roave/security-advisories,根本不用额外命令——只要composer install成功,就说明没引入已知高危版本;失败时 Composer 自带的冲突提示已足够清晰
真正容易被忽略的是:很多人把安全检查当成“补丁”,却忘了最有效的防御是不让漏洞版本进 lock 文件。比起事后扫描,约束解析过程本身更彻底,也更省资源。


















