composer默认不校验包完整性,因为它仅在首次下载dist包时比对composer.lock中的dist.sha256,而缓存存在、镜像替换、--prefer-source或path仓库等场景均跳过校验。

为什么 composer install 默认不校验包完整性?
Composer 默认只校验 ZIP 包的 SHA-256(仅限 Packagist 官方源),且跳过已缓存的包。这意味着:从镜像源安装、本地 dist 缓存未清理、或使用 --no-cache 但未启用完整性强制时,都可能绕过校验。真正能拦住篡改包的,是 composer install --verify 或更底层的 composer config --global secure-http true 配合严格签名策略。
composer install --verify 是唯一强制校验的命令开关
这个参数从 Composer 2.5 开始引入,会强制对每个下载的 dist 包执行 SHA-256 校验(对比 composer.lock 中记录的 dist.shasum),失败直接中止。它不依赖网络源是否可信,只认 lock 文件里的哈希值。
- 必须确保
composer.lock是可信来源生成的(比如由 CI 构建产出、经 GPG 签名验证) - 若 lock 文件里某包缺失
dist.shasum字段(旧版 Composer 生成或手动编辑过),--verify会报错:Missing shasum for package xxx - 不兼容
--no-install或--dry-run,二者同时使用会报错 - 执行时仍会走缓存,但校验发生在解压前——所以即使缓存被污染,也能当场发现
如何让所有项目默认启用严格校验?
全局配置无法自动加 --verify,但可通过以下方式收拢控制点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在项目根目录设
COMPOSER_VERIFY=1环境变量,composer install会自动识别并启用校验(Composer ≥2.5.5) - CI/CD 中统一用
composer install --verify --no-interaction --no-progress,避免交互和进度条干扰日志解析 - 禁用不安全协议:
composer config --global secure-http true,阻止 HTTP 源(防止中间人替换包元数据) - 慎用
composer config --global disable-tls true—— 这会彻底关闭 HTTPS 校验证书,与校验目标背道而驰
常见校验失败场景和应对
运行 composer install --verify 报错时,90% 不是包被篡改,而是环境或流程问题:
-
shasum does not match:lock 文件记录的哈希与实际下载包不符 → 检查是否混用了不同版本 Composer 生成的 lock(v1 和 v2 的 shasum 计算逻辑不同) -
Failed to decode JSON在校验阶段出现 → 往往是vendor/composer/installed.json被意外修改,删掉vendor/重装即可 - 私有包仓库返回 404 但校验失败提示模糊 → 确认该包在 lock 中的
dist.url是否可公开访问,或是否漏配repositories中的options.auth.basic - PHP 8.2+ 下某些旧扩展包因
dist压缩方式变更导致校验失败 → 升级对应包到支持版本,或临时用composer install --ignore-platform-reqs --verify分离平台检查与校验
校验本身不耗时,但一旦失败,排查重点永远在 lock 文件可信度、网络代理是否改写响应、以及私有源的 dist URL 是否稳定——而不是怀疑 Composer 的校验逻辑。










