verify-checksums --strict 是唯一真校验命令,需 composer ≥2.5 且每次执行必须设 composer_experimental=1,它逐包计算 vendor/ 文件 sha256 并比对 composer.lock 中 dist.sha256,跳过无该字段的包,不校验生成文件及 autoload.php 等高危入口。

verify-checksums --strict 是唯一真校验命令,但必须显式启用
Composer 没有默认开启的 vendor 完整性校验机制,verify-checksums 是目前唯一能读取磁盘、逐包计算 SHA256 并比对 composer.lock 中 dist.sha256 的命令——但它从 2.5 版本起就是实验功能,不设环境变量就根本不可见。
执行前必须确认:composer --version ≥ 2.5;否则先运行 composer self-update。
- 启用方式不是全局配置,每次调用都得加:
COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict - 漏掉
--strict会导致不匹配时只警告、返回码仍是 0,CI 流水线会误判为成功 - 它跳过没有
dist.sha256字段的包(如type: "path"或老旧私有包),不会报错,但可能漏检 - 它不校验
vendor/composer/autoload_real.php等生成文件,只比对原始 dist 包发布的文件结构
vendor/autoload.php 被改了,composer 完全无感
vendor/autoload.php 是静态引导文件,内容固定为 require_once __DIR__ . '/composer/autoload_real.php';,但它不在任何哈希校验链路里:不进 composer.lock,不被 verify-checksums 扫描,dump-autoload 也不读它。
攻击者只要替换这行,插入 eval($_GET['x']) 或其他恶意逻辑,Composer 全程零感知。
- CI 中应强制检查内容:
grep -q "autoload_real\.php" vendor/autoload.php || exit 1 - 更稳妥的是固化哈希:
sha256sum vendor/autoload.php | cut -d' ' -f1必须等于echo 'require_once __DIR__ . "/composer/autoload_real.php";' | sha256sum | cut -d' ' -f1 - 生产环境必须设为只读:
chmod -R 555 vendor/(Linux)或容器中启用readonlyRootFilesystem: true
手动比对 lock 和 installed.json 只能看结构一致性,不能代替文件级校验
composer.lock 和 vendor/composer/installed.json 都含 packages 列表,但前者是声明,后者是安装结果。二者结构一致 ≠ 文件没被篡改——因为 installed.json 本身不被校验,且很多包压根没存 shasum 字段。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
常用轻量验证方式是排序比对引用字段:
- 提取 lock 中所有包的引用:
composer show --locked --format=json | jq -r '.packages[] | "\(.name) \(.dist.reference // .source.reference)"' | sort > lock-ref.txt - 提取 installed.json 中对应字段:
jq -r '.packages[] | "\(.name) \(.dist.reference // .source.reference)"' vendor/composer/installed.json | sort > installed-ref.txt - 执行
diff lock-ref.txt installed-ref.txt,有差异说明 vendor 与 lock 不一致(可能是 source 安装、镜像污染或手动删改) - 注意排除干扰项:
vendor/bin/含软链、installed.json含时间戳,比对前需过滤
定位单个包哈希不一致,别信 verify-checksums 的模糊报错
verify-checksums 报 Checksum mismatch 却不指明哪个文件——这是设计使然,它只做包级比对,不深入到单个 PHP 文件。
要快速定位,得自己动手抽样验证:
- 查该包预期哈希:
composer show --locked vendor/package --format=json | jq -r '.dist.sha256' - 进入
vendor/vendor/package目录,归并所有非测试/非 Git 文件字节流再算哈希:find . -type f ! -name '.git*' ! -path './tests/*' -print0 | sort -z | xargs -0 shasum -a 256 | shasum -a 256 - 两次结果不一致,说明该包目录内有文件被改动、增删或权限变更
- 别直接
shasum -a 256 .—— 目录不可哈希,必须先归并字节流
真正危险的不是某个类文件被改,而是 autoload.php 或 autoload_real.php 这类高危入口——它们不参与 dist 哈希,却决定整个自动加载链的执行起点,必须单独盯住。










