verify-checksums --strict 是唯一能真实校验 vendor 文件哈希的命令,需启用实验模式 COMPOSER_EXPERIMENTAL=1,且必须加 --strict 才会失败而非仅警告;它逐包扫描 vendor 目录(排除 .git、tests/ 等),归并文件字节流计算 SHA256 并与 composer.lock 中 dist.sha256 比对,跳过 type: "path" 或无该字段的包,不校验 autoload_*.php 等生成文件;composer install 仅校验下载包解压前哈希,verify-checksums 则校验解压后实际文件,二者时机与对象不同;CI 中若用 --prefer-source 或污染缓存,install 可能绕过校验,而 verify-checksums 会暴露问题;报 mismatch 不指明具体文件,需手动提取包哈希并用 find+shasum 逐文件比对;生产部署前须设 vendor 为只读、断言 autoload.php 未篡改,且不可依赖 validate 或 --dry-run,因它们不读 vendor 也不算哈希;最危险的是 autoload.php 等关键文件完全游离在校验体系外,被注入恶意代码时 Composer 无法感知。

verify-checksums --strict 是唯一能真比对 vendor 文件哈希的命令
它不是默认可用的,必须显式启用实验模式:COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict。不加 --strict 时即使发现不匹配也只警告并返回 0,CI 流水线会误判为成功;不设 COMPOSER_EXPERIMENTAL=1 则根本看不到这个命令。
该命令逐包读取 vendor/ 目录下每个包的实际文件(排除 .git、tests/ 等非发布路径),归并字节流后计算 SHA256,并与 composer.lock 中对应包的 dist.sha256 字段比对。
- 跳过
type: "path"或没有dist.sha256字段的包(如老旧私有包),但不会报错,容易漏检 - 不校验
vendor/composer/autoload_*.php这类生成文件,只校验原始 dist 包解压结构 - 手动改过
vendor/autoload.php会导致失败——它虽是引导文件,但会被扫描到,且不在任何哈希记录中
为什么 composer install 成功后 verify-checksums 却失败
composer install 只在校验刚下载的 zip/tar 包(解压前)是否匹配 composer.lock 中的 dist.sha256;一旦解压落地,就不再回头检查。
verify-checksums 是真打开 vendor/ 目录,递归读所有文件再算一次 SHA256。两者校验时机和对象完全不同。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- CI 构建中用了
--prefer-source:走 git clone,完全绕过哈希校验,verify-checksums会跳过该包(无dist.sha256) - 本地缓存被污染后重装,却复用了坏包:install 阶段没触发校验(缓存命中),但 verify-checksums 会暴露磁盘上已存在的篡改
- 镜像源替换了 dist 包但未同步原始哈希:install 阶段“匹配”,verify-checksums 却发现内容不一致
verify-checksums 报 mismatch 却不指明哪个文件
这是设计使然——它只做包级比对,不深入到单个 PHP 文件。要定位问题包,得自己动手:
- 用
composer show --locked vendor/package --format=json提取该包的dist.sha256值 - 进入
vendor/vendor/package目录,运行:find . -type f ! -name '.git*' ! -path './tests/*' -print0 | sort -z | xargs -0 shasum -a 256 | shasum -a 256 - 对比输出结果与
dist.sha256是否一致;不一致说明该包目录内有文件被改动或增删 - 别直接跑
shasum -a 256 .—— 目录本身不可哈希,必须先归并所有文件字节流
生产环境部署前必须确认的三个细节
完整性校验不是“跑完命令就算数”,而是嵌入可信链路的关键动作。
-
vendor/目录必须设为只读:chmod -R a-w vendor/,否则运行时仍可能被覆盖 - 断言
vendor/autoload.php未被篡改:grep -q "autoload_real\.php" vendor/autoload.php || exit 1 - CI 中不要依赖
composer validate或--dry-run:它们不读vendor/,也不计算任何文件哈希
真正危险的不是哈希不匹配,而是你根本没意识到 vendor/autoload.php 这类文件完全游离在校验体系之外——它被注入恶意代码后,Composer 不会感知,也不会报警。

















