composer不提供运行时本地文件快照防篡改校验,仅在install/update下载阶段校验包哈希,无法检测vendor目录手动篡改;需自行用sha256sum等工具生成并定期比对快照,排除autoload生成文件,且应集成进部署后健康检查流程。

Composer 本身不提供基于本地文件快照的防篡改校验机制。你无法靠 composer install 或 composer update 自动验证 vendor/ 下每个 PHP 文件是否被修改过。 它只校验包内容哈希(来自 composer.lock),且该哈希是下载时计算、写入 lock 文件的,不是运行时重算的——一旦 vendor/ 被手动改动,Composer 不会主动发现。
composer.lock 的哈希校验只在安装/更新时生效
当你执行 composer install,Composer 会比对 composer.lock 中记录的每个包的 dist.sha256(或 dist.sha1)与刚下载的 ZIP 包解压后的内容哈希。但这个动作只发生在「下载并首次解压」阶段,不是每次加载代码前的运行时检查。
- 如果有人在
vendor/里直接改了monolog/monolog/src/Logger.php,composer install再跑一遍也不会报错——因为包已存在,Composer 默认跳过重新下载和校验 -
composer update也不会触发对已有文件的重校验,除非你加--force-install(它强制重装所有包,代价高且不常用) -
composer diagnose只检查配置和环境,不扫描 vendor/ 文件内容
如何手动实现本地文件快照校验
要真正检测 vendor/ 是否被篡改,得自己生成并维护快照。最轻量可靠的做法是用系统级工具生成文件哈希清单,而非依赖 Composer 自身:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 首次安装后立即生成快照:
find vendor/ -type f -name "*.php" -exec sha256sum {} \; > vendor.sha256 - 后续校验时对比:
sha256sum -c vendor.sha256 2>&1 | grep -v ": OK$"
(只显示失败项) - 注意排除自动生成文件:如
vendor/composer/autoload_*.php和vendor/bin/下的脚本,它们每次dump-autoload或install都可能变,不应纳入快照 - 建议把快照文件
vendor.sha256提交到 Git,但别提交vendor/目录本身
为什么不能依赖 composer show --security 或签名验证
composer show --security 查的是已知 CVE 漏洞,不是文件完整性;security.signature-verification true 验证的是 Packagist 上包发布时的 GPG 签名,防止中间人替换下载源,但它不防你本地磁盘上的文件被事后篡改。
- 签名验证只发生在下载阶段,且仅适用于 Packagist.org 上启用了签名的包(目前占比仍有限)
- 私有仓库、Satis、Git 仓库直连等方式默认不参与签名链,
composer install对它们完全不校验来源可信度 - 即使签名有效,也无法阻止运维人员或 CI 脚本在部署后执行
sed -i 's/true/false/g' vendor/some/lib.php这类操作
真正能防住本地篡改的,只有定期比对文件快照——而且必须由你控制快照生成时机和范围。别把它当成一次性的 setup 步骤,而应集成进部署后的健康检查流程里。否则,哪怕 lock 文件没动、签名全绿,vendor/ 里的代码也可能早已不是原来那套。










