composer install 不报安全预警,它仅按 composer.lock 精确还原依赖;安全检测需后续执行 composer audit 或 snyk test。

直接结论:composer install 本身不报安全预警,它只按 lock 文件装包;真正起作用的是前置的 composer audit 或 snyk test,且必须在 install 之后、CI 构建前执行。
为什么 composer install 不会主动报安全问题
composer install 的职责是“精确还原”,不是“安全判断”——它只校验 composer.lock 中每个包的 SHA256 hash 是否匹配,成功即退出码 0,失败才报错(比如 hash 不对或网络拉不到包)。它完全不连接任何漏洞数据库,也不扫描 advisories。
常见误解是以为加了 --dry-run 或 --verbose 就能看见漏洞提示,其实这些参数只影响安装过程的输出粒度,和安全无关。
- 如果你在 CI 里只跑
composer install,哪怕项目里有monolog/monolog 1.2.0(含 CVE-2016-1000031),它照样安静装完 - 真正触发告警的是后续命令,比如
composer audit --severity=critical或snyk test --file=composer.lock - 注意:
composer install成功 ≠ 依赖安全,只是“装得准”
必须在 install 后立即运行 audit 才有效
composer audit 只读 composer.lock,不看 composer.json。如果 CI 流水线里先 run composer install 再 run composer audit,但中间没确保 lock 文件最新,audit 就可能漏扫。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- CI 第一步必须确认
composer.lock存在且未被篡改:用sha256sum composer.lock对比 Git 提交记录里的哈希值 - 务必先执行
composer install --no-interaction --prefer-dist,否则composer.lock可能因本地环境差异被意外重写 - audit 默认只扫生产依赖(
--no-dev模式下装的那些),但像phpunit/php-code-coverage这类 dev 依赖引入的symfony/yaml漏洞同样危险,得显式加--with-dependencies - 退出码陷阱:
composer audit --format=json --severity=high找不到 high 级漏洞时返回空 JSON 且退出码为 0;只有命中才会返回非零码——别靠 exit code 判断是否“有结果”,要解析 JSON 内容
audit 和 snyk test 的关键区别与选型
两者都依赖 composer.lock,但数据源、覆盖范围和阻断逻辑不同,不能混用或互换。
-
composer audit调用 Packagist 官方 advisory 数据库,免费、轻量,但只覆盖 PHP 包,不查 C 扩展或私有包 -
snyk test --file=composer.lock调用 Snyk 漏洞库,覆盖更广(含间接依赖的 transitive path),但免费版每月限 200 次扫描,CI 频繁触发容易耗尽配额 - Snyk 必须指定
--file=composer.lock,传composer.json直接失败,错误信息是no supported manifest found - 若用 Snyk 做预警而非阻断,建议加
--json | jq -r '.vulnerabilities[] | select(.severity == "critical")'过滤,避免 medium 级漏洞误杀构建
最容易被忽略的三个执行前提
很多团队配置了 audit 命令却收不到告警,问题不在命令本身,而在执行链路上断了。
-
composer install必须在composer audit前执行,且不能加--no-scripts——因为某些插件(如symfony/flex)会在 post-install-cmd 里动态修改 autoload 或生成 config,影响后续扫描覆盖范围 - CI 环境里必须设
COMPOSER_NO_INTERACTION=1,否则composer install在无 TTY 时可能卡住,导致 audit 根本不执行 - 别信
composer show --outdated,它只对比composer.json声明的版本范围,不反映composer.lock实际安装的版本是否存在已知漏洞
真正落地的安全控制,不是加一条命令,而是把 install → audit → (可选)snyk test 串成原子操作,并让任一环节失败都中断构建。最脆弱的环节永远在第一步:lock 文件是否真实、完整、未经污染。










