dist.sha256仅是zip包字节指纹,非数字签名;它只校验下载包解压前哈希是否匹配composer.lock,不验证作者身份、不防元数据劫持、不覆盖autoload.php等已解压文件;字段为空时install和verify-checksums--strict均静默跳过,无报错。

dist.sha256不是签名,只是ZIP包字节指纹
dist.sha256 字段只校验你本地下载的 ZIP/TAR 包解压前的原始字节是否与 composer.lock 中记录的一致。它不绑定作者身份、不防元数据劫持、也不覆盖 vendor/autoload.php 或其他已解压后的文件。常见错误现象是:安装成功、composer diagnose 显示 secure-http: OK,但线上运行时触发未声明的 post-install-cmd,或某文件被篡改却无任何告警。
关键点在于:dist.sha256 为空时,composer install 和 verify-checksums --strict 都会直接跳过校验,既不报错也不提示。这在以下场景高频发生:
- 包作者仅发布
--prefer-source(Git 仓库),没打 dist ZIP 包 - 使用了私有源或
"type": "package"配置,绕过 Packagist 元数据流程 - 镜像站同步了 ZIP 包但没同步原始哈希值(如阿里云、腾讯云镜像常见做法)
verify-checksums --strict 是 vendor 层唯一落地校验手段
verify-checksums 命令本身不联网、不查远程元数据,只读取本地 vendor/ 目录下每个包的 ZIP 文件(若存在),重新计算 SHA256,并跟 composer.lock 中对应 dist.sha256 比对。但它默认不严格:哈希不匹配只警告,返回码仍是 0,CI 构建会误判成功。
必须加 --strict 才能使其失败退出:
- 执行
composer verify-checksums --strict,任意包哈希不匹配即返回非 0 状态码 - 若某包走的是
source安装(Cloning日志),则因无dist.sha256字段,该包被跳过——这不是 bug,是设计如此 - 注意:该命令不校验已解压后的 PHP 文件,只校验 ZIP/TAR 原始包。所以即使 ZIP 校验通过,
vendor/内文件仍可能被手动篡改
镜像源替换导致 signature verification 彻底失效
真正防中间人攻击的核心机制是 Packagist 的服务端 GPG 签名(signature 字段),不是 dist.sha256。但这个签名只在请求 repo.packagist.org 时由服务端注入,所有中文镜像(阿里云、腾讯云、清华源等)均不生成、不透传该字段。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
一旦你执行 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,Composer 就彻底放弃向官方源发起请求,signature 字段自然丢失。此时 composer diagnose 输出里绝不会出现 signature verification: OK,所有哈希校验都失去信任锚点。
正确启用签名验证必须满足三点:
- 先执行
composer config -g repo.packagist false,禁用全局源替换 - 再配置
composer config -g repos.packagist.type composer和repos.packagist.url https://mirrors.aliyun.com/composer/(注意末尾斜杠) - 确保
security.signature-verification true已启用
如何确认当前安装真在比对 SHA-256
不能只看有没有报错,得验证校验逻辑是否实际触发。最可靠方式是加详细日志观察下载路径:
- 运行
composer install -v,若输出中出现Downloading https://...+Extracting archive,说明走的是 dist 下载路径,dist.sha256校验会生效 - 若看到
Cloning https://github.com/...,说明走的是 source,完全不校验哈希 - 临时清空缓存:
composer clear-cache,再跑composer install --no-dev --prefer-dist;如果卡在Downloading后无响应,很可能是哈希校验失败被静默阻断(部分旧版 Composer 行为) - 检查
composer.lock中任意一个包的dist块,确认shasum字段存在且非空,例如"shasum": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
最易被忽略的是:镜像 URL 缺少尾斜杠会导致 Composer 误判为普通仓库而非元数据代理,进而关闭签名验证;而 dist.sha256 即使存在,也因来源不可信而失去意义。










