Composer 官方无 audit 命令;推荐用 roave/security-advisories + composer install --dry-run 拦截已知 CVE,辅以 phpstan-security 做静态安全分析。

composer audit 命令根本不存在
Composer 官方没有内置 composer audit 或类似安全扫描命令。你执行它只会看到 Command "audit" is not defined.。别被某些文章误导——安全审计不是 Composer 的职责,而是靠第三方工具协同完成的。
用 composer install --dry-run + security-advisories 插件定位高危包
最轻量、最贴近日常流程的做法:在 CI 或本地预检时,先模拟安装,再查已知漏洞。核心依赖是 roave/security-advisories 这个“禁止清单”式约束包。
- 运行
composer require --dev roave/security-advisories:dev-latest(注意是dev-latest,不是稳定版,它才实时同步 FriendsOfPHP/security-advisories 数据) - 再执行
composer install --dry-run—— 如果某依赖存在已知 CVE,Composer 会直接报错并终止,错误信息类似:Root composer.json requires package-name ^1.2, but roave/security-advisories forbids it due to known security issues. - 该方式不扫描代码逻辑或配置漏洞,只拦截已收录在 FriendsOfPHP 库中的公开 CVE,但胜在零额外工具链、无误报、与 lock 文件强绑定
用 phpstan + php-security-audit 扩展做静态规则检查
如果你需要发现硬编码密钥、危险函数调用(如 eval、unserialize)、不安全反序列化点等,得引入静态分析层。
- 安装
phpstan/phpstan和扩展phpstan/phpstan-security:composer require --dev phpstan/phpstan phpstan/phpstan-security - 运行
vendor/bin/phpstan analyse src/ --level=5(--level=5启用含安全规则的中等级别) - 常见捕获项:
Usage of dangerous function "exec"、Unsafe deserialization with "unserialize()"、Missing CSRF token in form submission—— 这些不会被roave/security-advisories覆盖 - 注意:它不检查第三方包内部实现,只审你自己的代码;且需配合自定义规则才能覆盖框架特定风险(如 Laravel 的
withTrashed()滥用)
CI 中串联 composer validate + cweagans/composer-patches + security-checker(已弃用)替代方案
旧版 security-checker 已停更,现在应切换到官方推荐的 symfony/cli 或直接调用 composer audit 的替代品——但注意:所谓“替代品”其实是外部 CLI 工具,和 Composer 本身无关。
- 验证 composer.json 合法性:
composer validate --no-check-all(避免因 schema 版本问题误报) - 确认补丁未绕过安全约束:
composer show --outdated --direct查明哪些直连依赖已过期,再结合cweagans/composer-patches看是否用 patch 临时规避了 CVE 却未升级 - 真正可用的现代替代:用
symfony-cli的symfony local:check:security(需symfony/flex项目)或独立工具oss-review-toolkit(适合企业级 SBOM+CVE 关联)
真正卡住审计落地的,往往不是工具选型,而是 lock 文件没提交、dev 依赖混入生产环境、或把 roave/security-advisories 放在 require 而非 require-dev 里导致线上强制失败。这些细节比选哪个命令更重要。


















