verify-checksums --strict 是唯一能真实校验 vendor 文件哈希的命令,需启用 composer_experimental=1 实验模式并加 --strict 才会失败;它逐包扫描 vendor 目录(排除 .git、tests/ 等),归并文件字节流计算 sha256 并与 composer.lock 中 dist.sha256 比对,跳过 type: "path" 或无该字段的包,不校验 autoload_*.php 等生成文件。

verify-checksums --strict 是唯一能校验 vendor 文件真实哈希的命令
它不是默认启用的功能,必须显式开启实验模式:COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict。不加 --strict 时即使发现文件哈希不匹配也只警告、返回码仍是 0,CI 流水线会误判为成功;不设环境变量则根本找不到这个命令。
该命令实际打开 vendor/ 目录,递归读取每个包下所有非排除路径(跳过 .git、tests/、examples/ 等)的原始字节流,归并后计算 SHA256,并与 composer.lock 中对应包的 dist.sha256 字段比对。
- 跳过
type: "path"的本地依赖,以及没有dist.sha256字段的老包(如部分私有镜像源分发的包) - 不校验
vendor/composer/autoload_*.php这类生成文件——它们完全游离在校验体系外 -
vendor/autoload.php被扫描但无哈希记录,手动改它会导致校验失败
为什么 composer install 成功后 verify-checksums 却报 mismatch
composer install 只在校验刚下载的 zip/tar 包解压前的哈希,一旦解压落地就不再检查;而 verify-checksums 是真读磁盘上已解压的文件再算一次 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,没dist.sha256,verify-checksums直接跳过该包 - 本地缓存被污染后重装,复用了坏包:
install阶段缓存命中、跳过校验,但verify-checksums会暴露磁盘上已存在的篡改 - 镜像源替换了 dist 包但未同步原始哈希:
install阶段“匹配”,verify-checksums却失败
生产部署前必须补的手动断言
verify-checksums --strict 不校验关键引导文件,所以得人工兜底:
- 将
vendor/目录设为只读(防止运行时写入篡改) - 用
sha256sum vendor/autoload.php计算哈希,与部署清单中预存值比对 - 确认
vendor/composer/autoload_classmap.php和autoload_files.php未被注入额外 require 行 - 不能依赖
composer validate或--dry-run:它们根本不读vendor/,也不算任何文件哈希
报 mismatch 后怎么定位具体是哪个文件坏了
verify-checksums 只告诉你 “某包哈希不匹配”,不指明具体文件。得手动提取线索:
- 从
composer.lock找出报错包的dist.sha256值 - 进
vendor/package-name/目录,用find . -type f -not -path "./.git/*" -print0 | xargs -0 shasum -a 256 | shasum -a 256归并计算总哈希 - 逐个对比子文件哈希,常见问题文件:被 IDE 自动生成的
phpunit.xml、CI 脚本写入的临时配置、或开发时手动 patch 过的src/文件
最危险的是那些没被哈希覆盖、又参与自动加载的关键文件——它们改了,verify-checksums 看不见,但程序可能已经执行恶意代码。










