composer audit 默认不生效是因为它仅在启用安全插件或配置审计策略时才运行,且默认只检查 require/require-dev 中的包,依赖 composer/advisories 数据源,不扫描 platform 或私有包,也无 php 运行时兼容性验证。

composer audit 命令为什么默认不生效
因为 composer audit 是 Composer 2.5+ 引入的内置安全检查功能,但默认只在启用了安全插件或配置了审计策略时才真正运行。没报错也不输出结果,不是它没运行,而是当前项目没触发审计条件——比如没有已知漏洞的依赖,或未启用严格模式。
常见现象:执行 composer audit 后直接返回空行或仅显示 “No security vulnerabilities found”,但你明明知道某个包(如 monolog/monolog)有 CVE-2023-46805,却没被扫出来。
- 确认 Composer 版本:
composer --version,低于 2.5 需升级:composer self-update - 默认只检查
require和require-dev中的包,不扫描platform或 lock 文件中被覆盖的版本 - 审计数据源来自 composer/advisories 仓库,该仓库每日同步 packagist.org 的已知漏洞,但不包含私有包或未上报的 CVE
如何启用自动审计并集成到 CI 流程
想让 composer audit 在 composer install 后自动跑、失败时中断构建,不能只靠 alias 或 shell 脚本拼接——CI 环境里要确保可重复、可审计、不漏报。
推荐方式是通过 scripts + config 组合控制行为:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在
composer.json的"scripts"中添加:"post-install-cmd": ["@php -r \"if (!getenv('COMPOSER_NO_AUDIT')) { system('composer audit --no-interaction --format=json'); }\""] - CI 脚本中显式启用审计:
COMPOSER_NO_AUDIT= composer install --no-interaction,避免本地开发误阻断 - 关键参数必须加:
--no-interaction(避免卡住)、--format=json(方便解析)、--strict(把低危漏洞也当错误,否则默认只报中高危) - 若需兼容旧版 Composer,可用
composer require --dev roave/security-advisories:dev-master作为兜底,但它会强制锁死所有有漏洞的包版本,可能引发兼容性冲突
audit 报告里的 “ignored” 漏洞是怎么回事
执行 composer audit --format=json 后,输出里出现 "ignored": true 字段,不代表漏洞不存在,而是当前项目主动豁免了该条目——通常是因为你在 composer.json 中配置了 "security-advisories" 白名单或 ignore 规则。
例如,你明确知道某组件在你的使用方式下不受 CVE-2022-1234 影响,又不想升级(因 API 不兼容),可以这样忽略:
{
"config": {
"secure-http": true
},
"extra": {
"security-advisories": {
"ignore": ["vendor/package:CVE-2022-1234"]
}
}
}
- 忽略写法必须严格匹配
"vendor/name:CVE-XXXX-XXXX"格式,大小写敏感,冒号不可省略 - 忽略只对
composer audit生效,不影响composer update的版本约束逻辑 - CI 中建议禁用 ignore:用
composer audit --no-interaction --strict --format=json | jq 'select(.ignored == true)' | wc -l做专项校验,防止“假阴性”累积
audit 和第三方工具(如 Snyk、Dependabot)的区别在哪
composer audit 是轻量级、离线优先、packagist 原生集成的方案;而 Snyk 等工具依赖远程数据库、支持跨语言、能分析代码调用路径。两者不是替代关系,是分层协作。
-
composer audit检查快(毫秒级)、无网络依赖、适合 pre-commit 或 build 阶段快速拦截明显风险;但它不分析你是否真的调用了有漏洞的函数 - Snyk CLI 需要 token、上传
composer.lock、结果延迟几分钟,但能识别“你用了unserialize()调用monolog的 handler”这类上下文敏感漏洞 - 实际推荐组合:CI 中先跑
composer audit --strict快速失败;再用 Snyk 扫描全量 lock 文件生成报告;最后人工复核高危项是否真实可达 - 注意:Dependabot 默认不读取
composer audit结果,它的 PR 是基于 GitHub Advisory Database,和 composer/advisories 数据源不同步,可能有数小时至数天延迟
真正容易被忽略的是:audit 不验证 PHP 运行时版本兼容性。比如一个包声明支持 PHP 8.0+,但它的某个补丁只在 8.2+ 里生效——这种“版本语义漏洞” audit 完全不感知,得靠 composer show --platform + 自定义脚本交叉比对。










