Composer默认校验dist.shasum(SHA-256),但仅在install/update时对dist包生效,需确认lock中shasum非空且64字符、启用security.signature-verification防仓库投毒、用COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict手动复核vendor完整性。

Composer 默认会校验 dist.shasum(SHA-256),但这个机制只在安装/更新时对下载的 zip/tar 包生效,且极易被绕过——不启用签名验证、不检查缓存、不锁定源类型,等于把门虚掩着。
确认 composer.lock 中的 shasum 字段是否真实参与校验
很多团队误以为只要运行了 composer install 就自动安全,其实校验是否触发,完全取决于 composer.lock 里有没有有效、未被清空的 dist.shasum 字段:
- 打开
composer.lock,搜索某个包的"dist"段,确认存在非空的"shasum": "a1b2c3..."(长度必须是 64 字符,对应 SHA-256;40 字符是旧版 SHA-1,已不推荐) - 运行
composer install --no-scripts --no-plugins,观察输出:若看到Installing vendor/package (v1.2.3): Downloading (100%)后无报错,说明校验通过;若有Signature mismatch或Hash does not match,说明校验逻辑被触发并拒绝了异常包 - 手动测试:改一个包的
shasum值为随机字符串(如"shasum": "0000"),再运行composer install—— 必须中止并报错;否则说明 lock 文件未被读取,或用了--ignore-platform-reqs等危险选项绕过了校验
启用 Packagist 元数据 GPG 签名验证(防仓库投毒)
仅校验单个包的 shasum 不够:攻击者可污染 packages.json,把恶意包塞进搜索结果或版本列表。Packagist 自 2021 年起提供 GPG 签名,Composer ≥2.5 默认支持,但需显式开启:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
composer config -g security.signature-verification true(低于 2.5 的版本会报Unknown configuration setting "security.signature-verification") - 检查是否生效:
composer show --security输出中必须含Signature verification: enabled - 该机制不依赖你本地导入密钥——Composer 内置信任 Packagist 公钥(来自
https://packagist.org/keys.json),但要求 HTTPS 链路完整:secure-http必须为true,且未设置disable-tls - 一旦启用,
composer outdated或composer update拉取packages.json时会校验 GPG 签名;失败则拒绝加载包列表,直接报错
用 verify-checksums 手动复核已安装的 vendor/ 文件
composer install 只在校验下载包那一刻比对哈希,落地后就不再回检。而 vendor/autoload.php 被手动篡改、CI 构建机残留旧文件、或缓存 zip 被污染,都不会触发任何警告。唯一能真正比对当前 vendor/ 目录与 composer.lock 是否一致的命令是:
- 确认 Composer ≥ 2.5:
composer --version;低于则先composer self-update - 启用实验功能:
COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict(注意:--strict很关键,没有它即使发现不匹配也只警告并返回 0,CI 会误判成功) - 该命令逐包读取
vendor/下每个包的文件内容(排除.git、tests/等非发布路径),计算整体 SHA-256,并与composer.lock中对应dist.shasum比对 - 若报
Checksum mismatch但没指明哪个文件,说明是包级整体哈希不一致——可用composer show --locked vendor/package --format=json提取该包的dist.shasum,再进vendor/vendor/package手动执行find . -type f ! -name '.git*' ! -path './tests/*' -print0 | sort -z | xargs -0 shasum -a 256 | shasum -a 256对比
绕过校验的常见方式和防护盲区
哪怕所有开关都开了,以下行为仍会让校验形同虚设:
- 用了
--prefer-source:改走 git clone,完全跳过dist.shasum校验 - 包在
composer.lock中没有dist.shasum字段(常见于老旧包、私有源、或旧版 Composer 生成的 lock) - 自定义
repositories指向非 Packagist 源,且未提供合法dist元数据 - 国内镜像源未同步原始哈希,或替换了 dist 包——哈希“匹配”,但内容非 Packagist 原始发布版本
-
vendor/autoload.php是固定引导入口,内容只是require_once __DIR__ . '/composer/autoload_real.php';,它被篡改后composer dump-autoload完全无感,运行时才触发风险
最易被忽略的是:生产环境部署前,vendor/ 目录必须设为只读(chmod -R a-w vendor/),否则任何后续写入(包括 CI 脚本、调试修改、甚至某些 IDE 插件)都会让之前所有校验失效。

















