composer verify-checksums --strict 是唯一能真正校验已安装包(如 topthink/think)文件是否被篡改的命令,需 composer ≥2.5 且启用 composer_experimental=1;composer install 仅在下载 dist 包时校验一次哈希,vendor 落地后任何修改(如替换 start.php 或注入 autoload.php)均无法自动发现,而 verify-checksums 通过比对 vendor 目录聚合 sha256 与 composer.lock 中 dist.sha256 实现包级完整性验证。

composer verify-checksums 是唯一能真正校验已安装包(包括 topthink/think)文件是否被篡改的命令,但它默认不启用,且必须配合 --strict 才会中断流程。
为什么 composer install 没报错,但 tp 包可能已被污染?
Composer 安装 topthink/think 时只在校验 dist 包(zip)下载后比对一次 composer.lock 中的 dist.sha256。一旦 vendor 目录落地,后续任何修改——比如有人替换了 vendor/topthink/think/start.php 或 vendor/autoload.php ——都不会被自动发现。
常见绕过场景:
- 本地缓存被污染(
~/.composer/cache/files/topthink/think/xxx.zip被手动改过)→ Composer 复用缓存,跳过哈希比对 - 用了
--prefer-source→ 改走 git clone,完全不读dist.sha256 - 国内镜像源未同步原始哈希,或替换了 zip 包 → “匹配”但内容非官方发布
-
vendor/autoload.php被注入eval($_GET['x'])→ 这个文件是固定引导入口,composer dump-autoload根本不读它,更不会报错
composer verify-checksums 怎么用才有效?
这个命令从 Composer 2.5+ 开始提供,但属于实验性功能,必须显式启用:
- 确认版本:
composer --version≥ 2.5;否则先运行composer self-update - 启用实验模式:
COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict -
--strict是关键:没有它,哪怕发现不匹配也只警告并返回 0,CI 会误判为成功 - 它只校验
topthink/think等包在composer.lock中声明的dist.sha256与当前vendor/topthink/think/目录实际内容是否一致(排除.git、tests/、vendor/bin/等非发布路径)
为什么 verify-checksums 报错却没说哪个文件坏了?
它做的是包级哈希比对,不是文件粒度扫描。当提示 Checksum mismatch for topthink/think,说明整个包目录的聚合哈希与 lock 文件不一致,但不告诉你具体哪行 PHP 被改了。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
快速定位建议:
- 先提取该包的预期哈希:
composer show --locked topthink/think --format=json | jq -r '.dist.sha256' - 手动计算当前目录哈希(排除干扰):
find vendor/topthink/think -type f ! -path '*/.git/*' ! -path '*/tests/*' ! -path '*/vendor/bin/*' -print0 | sort -z | xargs -0 shasum -a 256 | shasum -a 256 - 对比两个 SHA256 值;不一致就说明有文件被增删或修改,重点检查
start.php、base.php、console.php和vendor/autoload.php
生产环境最简防御组合
单靠一个命令防不住所有链路。真正起效的是三件事同时做:
- 部署脚本中强制重装:
rm -rf vendor && COMPOSER_EXPERIMENTAL=1 composer install --no-cache --prefer-dist --optimize-autoloader - 紧接着校验:
COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict - 设
vendor/为只读:chmod -R a-w vendor/(防止运行时被写入恶意文件)
注意:vendor/autoload.php 不在任何哈希链路里,它被篡改后,verify-checksums 也检测不到——这是最容易被忽略的一环。










