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 被改了。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
快速定位建议:
- 先提取该包的预期哈希:
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 也检测不到——这是最容易被忽略的一环。

















