composer 不校验已安装 vendor 文件完整性,仅在 install/update 时对 dist 包做一次 sha-256 校验;autoload.php 被篡改完全无感知,需手动快照比对或设为只读防护。

Composer 没有运行时自动校验 vendor 文件完整性的能力,所谓“验证”只发生在 composer install 或 composer update 的那一刻,且仅对 dist 包(zip/tar)生效;已安装的文件被篡改后,它完全无感。
dist.sha256 校验只在下载解压前跑一次
Composer 会从 composer.lock 中读取每个包的 dist.sha256 字段,下载完 zip/tar 后立即计算其 SHA-256 值并比对。不一致就中断,报错类似:Signature mismatch, package is corrupted。
- 这个校验只在下载完成、解压前执行,不依赖缓存——但若缓存中已有该文件(且未加
--no-cache),Composer 会直接复用,跳过重新下载与哈希比对 -
--prefer-source完全绕过:走 git clone,不查dist.sha256,也不做任何哈希校验 - 私有源或
"type": "package"配置下,dist.sha256字段可能为空,校验逻辑直接跳过 - 镜像源若替换 dist 包但未同步原始哈希(如某些国内镜像延迟或自建替换),哈希值“匹配”,内容却已非作者发布
vendor/autoload.php 被改了,dump-autoload 不会发现
vendor/autoload.php 是个固定引导文件,内容恒为:require_once __DIR__ . '/composer/autoload_real.php';。它被注入 eval($_GET['x']) 或替换成恶意代码后,composer dump-autoload 完全不会读取、比对或报错。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
dump-autoload只负责生成vendor/composer/autoload_*.php映射文件,和autoload.php本身无关 - 这个文件不在任何哈希校验链路里——
composer.lock不记录它的哈希,installed.json也不存 - 生产环境应设为只读:
chmod -R a-w vendor/;CI 中可用grep -q "autoload_real\.php" vendor/autoload.php || exit 1快速断言
怎么手动验证 vendor 是否被篡改?
没有一键命令,但可组合现成输出做离线比对:composer show --locked --format=json 提供锁文件哈希,composer show --installed --format=json 提供已安装元数据(含 dist-sha256),二者 key-by-key 对比即可发现不一致。
- 注意:若用了
--prefer-source,比对的是source-reference(git commit hash),不是哈希值 -
vendor/composer/installed.json是安装后写入的,但它可能被污染——更稳妥的做法是用 clean install 后的 tar 快照哈希比对 - CI 推荐用
tar排除干扰项生成快照:--exclude='./vendor/bin' --exclude='./vendor/composer/installed.json',再用sha256sum -c验证 - 别信
composer verify-signature:这个命令根本不存在,所有相关教程或插件都不可靠
启用 GPG 签名验证只能防仓库投毒,不能防包内容恶意
Packagist 元数据(packages.json)支持 GPG 签名,启用后可防止攻击者篡改索引把恶意包塞进搜索结果。但这跟包体内容无关,也**不校验你 require 的那个 zip 有没有被作者签名**。
- 启用方式:
composer config --global signing-key https://packagist.org/keys.json,且需 Composer ≥ 2.2 - 它只验证
packages.json是否由 Packagist 私钥签署,不验证单个包的 dist 包是否带作者签名 - Packagist 页面上显示的 “Verified” 标签 ≠ 本地已校验,只是说明作者上传时附带了签名
- 真正要防包内容风险,得靠
composer audit(查已知漏洞)+ 锁定官方源 + CI 中哈希快照比对
最常被忽略的点是:哈希校验只保“传输没被中间人改”,不保“包本身是否恶意”;而 vendor/autoload.php 这种高危入口文件,既不参与哈希链,也不在任何校验范围内——它被改了,没人知道,直到上线运行出事。










