composer status不校验文件哈希,仅比对git提交或dist归档快照,不检查vendor/autoload.php等生成文件,无法识别恶意替换;真正校验需用composer_experimental=1 composer verify-checksums --strict。

composer status 本身不校验文件哈希,只比对 Git 提交或 dist 归档快照
它不是安全扫描工具,也不会计算 vendor/autoload.php 或任意 PHP 文件的 MD5/SHA256。它的原理是:对每个已安装包,检查当前 vendor/ 目录内容是否与 composer.lock 中记录的原始 dist 归档(zip/tar)解压后一致,或与 source 安装时的 Git commit hash 一致。
这意味着:
- 如果包是
--prefer-source安装的,status会尝试git status检查工作区变更; - 如果是
--prefer-dist,它依赖本地缓存中该包归档的原始哈希快照——但这个快照不对外暴露,也无法被你手动复用; -
status不读取、不验证vendor/composer/autoload_*.php这类生成文件,也不管vendor/autoload.php是否被篡改; - 输出 “No local changes” 只表示“没发现和原始安装态不一致”,不代表文件没被恶意替换——比如攻击者删掉原文件、放个同名木马进去,只要内容字节不变(极难但非不可能),
status就无法识别。
想用 MD5/SHA256 真正校验 vendor 文件,必须绕过 status,直接比对 lock 和磁盘
composer status 不提供哈希输出接口,也没法导出每个文件的预期 MD5。要落地文件级完整性校验,得自己拼接命令链:
- 从
composer show --locked --format=json提取每个包的dist.sha256和name; - 定位到
vendor/vendor/name目录(注意name是vendor/package格式,路径取后半段); - 排除非发布内容:
find . -type f ! -path "./.git/*" ! -path "./tests/*" ! -path "./vendor/bin/*" -print0; - 按字典序排序后统一哈希:
sort -z | xargs -0 sha256sum | sha256sum | cut -d' ' -f1; - 用
grep -q "$hash"判断是否匹配——不匹配就说明该包目录内有增删改。
别用 md5sum vendor/ —— 目录不可直接哈希;也别漏掉 sort -z,否则文件顺序不同会导致最终哈希不一致。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
为什么 vendor/autoload.php 被改了,status 也完全没反应
vendor/autoload.php 是 Composer 安装后硬编码生成的引导文件,内容固定为 require_once __DIR__ . '/composer/autoload_real.php';。它不属于任何 dist 包的原始发布内容,composer.lock 里没有它的哈希记录,status 也就不会把它纳入比对范围。
更关键的是:dump-autoload、install、update 全都不校验它;哪怕你把它替换成 eval($_GET['x']),所有 Composer 命令照样成功返回。唯一能拦住这种篡改的,是生产环境设 chmod -R a-w vendor/,或者 CI 中加一行 grep -q "autoload_real\.php" vendor/autoload.php 做断言。
真正能用于生产部署的轻量级校验组合
单靠 status 或单靠手写哈希脚本都不够鲁棒。推荐在 CI 部署前跑这三步:
-
composer status --verbose | grep -q "modified:" && exit 1—— 拦住人为修改; -
COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict—— 要求 Composer ≥ 2.5,且必须带--strict,否则失败也返回 0; -
grep -q "autoload_real\.php" vendor/autoload.php || exit 1—— 防入口文件被替换。
这三步覆盖了:源码层改动、dist 包文件级篡改、关键入口文件完整性。其中 verify-checksums 是目前唯一由 Composer 官方提供的、真正读磁盘算哈希并与 composer.lock 对标的机制,但它仍需手动启用实验模式,且对 path 类型包自动跳过——这点很容易被忽略。










