verify-checksums --strict 需启用 composer_experimental=1 环境变量才可用,仅校验 --prefer-dist 安装包的 dist.sha256,跳过无该字段的包;不校验 vendor/autoload.php,需手动设为只读并断言;手动比对须排除非发布路径后归并字节流计算哈希。

verify-checksums --strict 必须加 COMPOSER_EXPERIMENTAL=1 才能用
这个命令不是默认启用的,不设环境变量就根本执行不了。直接运行 composer verify-checksums --strict 会报错 Command "verify-checksums" is not defined. 或者静默失败。必须每次调用都带上:COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict。
它只校验通过 --prefer-dist 安装的包(即 zip/tar 归档),跳过 git clone、path 类型或 "type": "package" 的包——这些包在 composer.lock 里压根没有 dist.sha256 字段,verify-checksums 会直接忽略,也不报错。
-
--strict是硬性要求:没它,哪怕哈希不匹配也只警告,返回码仍是0,CI 流水线完全无法感知 - 排除路径固定:
.git/、tests/、vendor/bin/、vendor/composer/等非发布内容不参与哈希计算 - 它不校验
vendor/autoload.php的内容是否被注入恶意代码——因为这个文件是 Composer 运行时生成的引导入口,不在任何dist.sha256覆盖范围内
中文包 dist.sha256 为空时 verify-checksums 会跳过,不报错也不校验
很多中文私有包、自建镜像源包或 "type": "package" 配置的包,在 composer.lock 中没有 dist.sha256 字段,verify-checksums 就直接跳过它们。这不是 bug,是设计如此——它只认 lock 文件里明确写了哈希值的 dist 包。
常见原因包括:
- 包作者只提供了
--prefer-source发布路径,没打 dist zip 包 - 用了国内镜像源但未同步原始哈希(比如某些自建源替换了 dist 包却没更新
sha256) -
composer.json显式写了"type": "package",绕过了 Packagist 元数据校验逻辑
此时不能依赖 Composer 内置机制,得靠外部快照比对:CI 构建开始前用 composer show --installed --format=json 记录当前状态,部署前再跑一次,用 jq 提取 .distReference 和 .name 排序后 diff,有差异就说明 vendor 与 lock 不一致。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
vendor/autoload.php 被篡改,verify-checksums 和 dump-autoload 都无感
vendor/autoload.php 是 Composer 安装时生成的固定引导文件,内容恒为:require_once __DIR__ . '/composer/autoload_real.php';。它被手动替换成 eval($_GET['x']) 或其他恶意代码后,composer verify-checksums 不会报错,composer dump-autoload 也不会发现——后者只读 vendor/composer/autoload_real.php 并重新生成映射文件,完全不碰 autoload.php 本身。
这个文件不在任何哈希校验链路里:composer.lock 不记录它的哈希,installed.json 也不存。生产环境唯一可靠防护是设为只读:chmod -R a-w vendor/;CI 中加断言:grep -q "autoload_real\.php" vendor/autoload.php || exit 1。
手动比对单个包哈希时,必须排除非发布路径再归并字节流
当 verify-checksums 报 Checksum mismatch 却没指明具体文件,就得手动定位到包级。不能直接 shasum -a 256 vendor/myorg/mypackage——目录不可哈希,必须先归并所有有效文件字节流。
正确做法:
- 用
composer show --locked vendor/myorg/mypackage --format=json提取dist.sha256值 - 进入
vendor/myorg/mypackage目录 - 运行:
find . -type f ! -name '.git*' ! -path './tests/*' ! -path './vendor/*' -print0 | sort -z | xargs -0 shasum -a 256 | shasum -a 256
注意排除 .git*、tests/、vendor/ 等非发布内容,且 sort -z 确保文件顺序一致,否则哈希结果不同。两次 SHA256 不一致,就说明该包目录内有文件被改动或增删。










