Composer 默认不验证包作者 GPG 签名,仅校验 composer.lock 中 dist.sha256 与下载压缩包的实际哈希是否一致——该校验默认开启、不可绕过,但仅对 dist 包生效且只在 install/update 当时运行一次;vendor 目录落地后不再回检,篡改无感知。

Composer 默认不验证包作者的 GPG 签名,只校验 composer.lock 中记录的 dist.sha256 与下载后压缩包的实际哈希值是否一致——这个校验默认开启、不可绕过,但仅对 dist 包(.zip/.tar.gz)生效,且只在安装/更新当时运行一次。
composer install 为什么没报错,但 vendor 里文件可能已被篡改
因为 Composer 不会回检已安装的 vendor/ 目录。校验只发生在下载完成、解压前那一刻;一旦文件落地,后续任何修改(比如手动改了 vendor/autoload.php 或 CI 构建机残留旧文件)都不会触发警告。
-
composer dump-autoload完全不读取或比对vendor/autoload.php内容,它只生成vendor/composer/autoload_*.php - 缓存复用时(如
~/.composer/cache/files/中已有 zip),Composer 可能跳过重新下载和哈希比对 - 用了
--prefer-source、"type": "package"或自定义repositories,就彻底绕过dist.sha256校验 -
vendor/autoload.php被注入恶意代码后,运行时才会触发,Composer 全程无感
如何启用真正的 GPG 签名校验(只限 dist 包)
这个功能存在,但不是默认开启,且仅适用于 Packagist 上明确上传了签名的包(如 Laravel、Symfony 官方包)。它不校验 source 包,也不校验你本地改过的文件。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 确认版本 ≥ 2.2:
composer --version - 全局启用:
composer config --global security.signature-verification true - 临时启用:
composer install --verify-signatures - 验证是否生效:手动改一个已签名包在
composer.lock中的dist.shasum,再运行带--verify-signatures的命令——应报Missing signature for vendor/package,而非单纯哈希错 - 注意:
Packagist页面显示的 “Verified” 标签 ≠ 本地已校验;它只是说明作者上传时附带了签名
怎么手动验证 vendor 文件是否与 lock 文件一致
没有一键命令默认可用,但 Composer 2.5+ 提供实验性命令 verify-checksums,需显式启用环境变量,且必须加 --strict 才会失败退出。
- 启用并运行:
COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict - 它逐包读取
vendor/下每个包的文件内容(排除.git、tests/等非发布路径),计算整体 SHA-256,并与composer.lock中对应dist.sha256比对 - 若报
Checksum mismatch但没指明具体文件,说明包级哈希不一致,需手动定位:composer show --locked vendor/package --format=json提取哈希,再用find . -type f ! -name '.git*' -print0 | sort -z | xargs -0 shasum -a 256 | shasum -a 256计算目录哈希 - 该命令跳过无
dist.sha256字段的包(如 path 类型源),不会报错
为什么不能只靠 shasum 就认为包安全
dist.sha256 只保“下载没被中间人改”,不保“包本身是否恶意”。攻击者可通过抢注废弃包名、发布形近包(如 laravel/framework-fake)、或作者自己投毒等方式让哈希合法但内容危险。
- Packagist 不强制绑定 GitHub 账号或二次验证邮箱,只要注册邮箱能收信,就能发布任意
vendor/name - 国内某些镜像源未同步原始哈希,或替换了 dist 包——哈希匹配,但内容已非作者发布
- 真正防仓库投毒,得启用 Packagist 元数据 GPG 验证:
composer config --global signing-key https://packagist.org/keys.json,它校验的是packages.json是否被篡改,不是包体 - 高敏感项目建议组合使用:
composer audit(查已知漏洞)、CI 中强制--no-cache --prefer-dist、生产环境设vendor/为只读

















