composer 默认校验包完整性,但仅在走 dist 下载、composer.lock 存在且未被污染、未禁用校验时生效;若用 --prefer-source、--no-scripts、shasum 缺失或 path 类型包,则跳过 hash 校验。

Composer 默认会校验下载包的完整性,但这个机制只在特定条件下生效——不是所有安装方式、不是所有包类型、也不是所有配置下都起作用。关键看是否走 dist 下载路径、composer.lock 是否存在且未被污染、以及是否禁用了校验逻辑。
为什么 composer install 有时不报 hash mismatch 错误?
常见现象是:你改了某个包的 zip 文件内容,重新运行 composer install 却没报错。这通常是因为:
- 项目中用了
--prefer-source或全局设置了preferred-install为source,导致跳过dist.shasum校验(git clone 不校验 hash) - 执行了
composer install --no-scripts --no-plugins,它会绕过部分验证钩子,某些版本甚至跳过 hash 比对 -
composer.lock文件里对应包的dist.shasum字段为空或缺失(旧版 Composer 或手动编辑过 lock 文件) - 包本身是通过
path类型仓库引入的本地包,Composer 默认不对其生成或校验 dist hash
如何确认当前安装是否真正在校验 SHA-256/SHA-1?
不能只看有没有报错,得主动验证校验逻辑是否启用:
- 检查
composer.lock中任意一个包的dist块,确认存在非空shasum字段,例如:"shasum": "a1b2c3d4..." - 运行
composer install -v,观察输出中是否出现类似Downloading https://.../package.zip+Extracting archive的流程——这是走 dist 下载;若看到Cloning ...则是 source,无 hash 校验 - 临时删掉 vendor/ 并清空 Composer 缓存:
composer clear-cache,再运行composer install --no-dev,此时若网络正常却卡在 “Downloading” 后没进展,大概率是校验失败被静默阻断(部分旧版本行为)
手动比对 hash 值是最直接的验证方式
当怀疑某包被篡改,或需要离线审计时,可跳过 Composer 自动流程,自己算 hash:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 从
composer.lock中复制目标包的dist.url和dist.shasum - 用
curl -L -o package.zip <url></url>下载原始 zip - 运行
sha1sum package.zip或sha256sum package.zip(注意:Composer 默认用 SHA-1,除非 lock 中明确写了sha256字段) - 比对输出是否与
dist.shasum完全一致(区分大小写、无空格)
特别注意:如果包是通过私有仓库或镜像源下载的,务必确保你下载的 URL 和 lock 文件中记录的一致——镜像源可能缓存了旧版 zip,而官方源已更新但未同步。
签名验证 ≠ hash 校验,别混淆两者
很多人以为开了 security.signature-verification 就万事大吉,其实它只验证 Packagist 元数据(如 packages.json)的 GPG 签名,防止仓库投毒;而包文件本身的完整性,仍靠 dist.shasum。两者是独立机制:
-
dist.shasum防“下载过程中被中间人篡改”或“镜像源缓存污染” - GPG 签名防“Packagist 的包列表被伪造”,比如攻击者控制了镜像源服务器,返回假的 packages.json 指向恶意 zip
- 即使签名验证开启且通过,只要
dist.shasum被改写进 lock 文件,Composer 仍会按错误 hash 去比对——所以 lock 文件本身必须可信
真正难防的是 lock 文件被污染 + 开发者盲目提交,或者包作者自己投毒后发布新版。hash 校验再严,也拦不住源头作恶。










