composer 不校验网络传输层完整性,仅在下载 dist 包时比对 composer.lock 中的 dist.sha256;绕过方式包括 --prefer-source、污染缓存、镜像源替换等,且常静默生效,需用 composer_experimental=1 composer verify-checksums --strict 主动回检。

Composer 本身不校验网络传输层完整性,也不自动重验已安装的 vendor/ 文件——它只在 composer install 或 composer update 下载 dist 包(zip/tar)时,比对一次 composer.lock 中的 dist.sha256 字段。绕过这个校验非常容易,且不会报错。
确认 dist.sha256 是否真实参与校验
不能只看有没有报错,得验证校验逻辑是否被触发:
- 打开
composer.lock,搜索任意包的dist段,确认存在非空的"sha256": "a1b2c3..."(长度必须是 64 字符),旧版可能只有 40 字符 SHA-1,但 Composer ≥2.2 默认优先用 SHA-256 - 运行
composer install -v,观察输出中是否出现Downloading https://.../package.zip+Extracting archive;若看到Cloning,说明走了--prefer-source,完全跳过哈希校验 - 临时清空缓存并删掉
vendor/:执行composer clear-cache && rm -rf vendor/,再运行composer install --no-dev;如果卡在Downloading后无响应,很可能是哈希不匹配被静默阻断(部分旧版本行为)
为什么 composer install 没报错,但包还是被篡改了?
常见绕过方式不是 bug,而是设计使然:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用了
--prefer-source或全局配置"preferred-install": {"*": "source"}→ 改走 git clone,dist.sha256字段被忽略 - 执行了
composer install --no-scripts --no-plugins→ 某些 Composer 版本会跳过哈希比对逻辑 - 本地缓存被污染:
~/.composer/cache/files/vendor/package/xxx.zip被手动修改过 → Composer 复用缓存,不重新下载、不重新校验 - 国内镜像源未同步原始哈希,或替换了 zip 包 → “匹配”成功,但内容非 Packagist 官方发布版本
-
composer.json中用了"type": "package"或"repositories": [{"type": "path", ...}]→ 不生成也不校验dist.sha256
composer verify-checksums --strict 是唯一能回检 vendor 的命令
这个命令从 Composer 2.5+ 开始提供,但默认禁用,必须显式启用实验模式:
- 先确认版本:
composer --version≥ 2.5;否则运行composer self-update - 每次调用都必须加环境变量:
COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict(注意:--strict是关键,没有它即使不匹配也只警告、返回码为 0) - 它只比对
vendor/下每个包的实际文件内容(排除.git/、tests/、vendor/bin/等非发布路径)与composer.lock中dist.sha256是否一致 - 不支持文件粒度定位:报
Checksum mismatch for vendor/package只说明整个包目录聚合哈希不一致,不会告诉你哪行 PHP 被改了
生产环境必须做的三件事
靠单个命令无法兜底,得组合控制:
- 部署前设
vendor/为只读:chmod -R a-w vendor/,防止运行时被注入或覆盖 - CI 中加检查:
grep -q "autoload_real\.php" vendor/autoload.php || exit 1,因为该文件内容固定,被篡改后composer dump-autoload完全无感 - 禁用自定义源:
composer config --unset repositories,强制所有包走 Packagist 官方源(它会对上传包做基础扫描和哈希存档),避免私有源或镜像源绕过校验
最危险的点不是校验没生效,而是你以为它生效了——比如 composer install 成功就以为安全,却忽略了 --prefer-source、缓存污染或镜像源替换这些静默绕过方式。










