composer 默认通过 composer.lock 中的 dist.shasum 字段(sha-256,64字符)校验包完整性:打开文件确认字段存在且非空;安装时若输出 “downloading (100%)” 无报错即校验通过;手动篡改 shasum 后运行 install 必须报 “signature mismatch” 才证明生效。

Composer 默认已启用包完整性校验,但仅靠默认行为不足以抵御供应链投毒——关键在于确认 shasum 校验生效、启用元数据签名,并阻断被篡改的 composer.lock 绕过校验。
如何确认 composer.lock 中的 shasum 正在真实生效
Composer 安装时是否真正比对哈希,取决于 composer.lock 文件里是否有有效 shasum 字段,且该字段未被人工清空或覆盖。很多团队误以为只要运行了 composer install 就自动安全,其实不然。
- 打开
composer.lock,搜索某个包的dist段,确认存在非空的"shasum": "a1b2c3..."(长度应为 64 字符,对应 SHA-256);旧版可能只含 40 字符 SHA-1,但现代 Composer ≥2.2 默认优先用 SHA-256 - 执行
composer install --no-scripts --no-plugins,观察输出:若看到Installing vendor/package (v1.2.3): Downloading (100%)后无报错,说明校验通过;若有Signature mismatch或Hash does not match,即表示校验触发并拒绝了异常包 - 手动测试:修改某包
shasum值为随机字符串(如"shasum": "0000"),再运行composer install,必须中止并报错——否则说明 lock 文件未被读取或校验逻辑被绕过(例如用了--ignore-platform-reqs等危险选项)
启用 Packagist 元数据 GPG 签名验证(防仓库投毒)
仅校验单个包的 shasum 不够:攻击者可污染 packages.json,把恶意包塞进搜索结果或版本列表里。Packagist 自 2021 年起提供 GPG 签名,Composer ≥2.5 默认启用,但需显式开启全局开关。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 运行
composer config -g security.signature-verification true(注意:低于 2.5 的版本会报Unknown configuration setting "security.signature-verification") - 检查是否生效:
composer show --security输出中必须含Signature verification: enabled - 该机制不依赖你本地导入密钥——Composer 内置信任 Packagist 公钥(来自
https://packagist.org/keys.json),但要求 HTTPS 链路完整:确保secure-http为true,且未设置disable-tls - 一旦启用,Composer 拉取
packages.json时会校验 GPG 签名;失败则拒绝加载包列表,连composer outdated都会报错
防止 vendor 目录被静默覆盖导致补丁丢失
很多人在调试时手动修改 vendor 下的文件,结果下次 composer install 直接删掉整个目录重装——这不是校验失效,而是 discard-changes 行为默认开启。它让“看似成功”的安装实际丢弃了关键修复。
- 在项目
composer.json的config段添加:"discard-changes": false(不是全局配置,composer config -g不支持) - 生效后,只要检测到某包
vendor下有未提交的修改,就会中断并提示:Changed files in vendor/package-name will be discarded. Use --force to overwrite. - 这不是让你保留修改,而是强制暴露问题:此时你必须决定是删掉临时改动、用
--force覆盖(不推荐)、还是改用path仓库或composer-patches插件管理补丁 - CI 环境中尤其要设此值,否则缓存的
vendor可能掩盖已丢失的定制逻辑
校验机制的盲区与应对思路
Composer 的校验链始于 composer.lock,终于 dist 包哈希比对,但它不验证 source 克隆(Git 仓库)的内容,也不审计代码逻辑是否含后门。这意味着:
-
source类型包(如"type": "package"或"dev-master")不走shasum校验,完整性依赖 Git 本身和你对远程仓库的信任 -
composer audit是独立的安全扫描,不参与下载校验流程;它查 CVE,但不查哈希,也不防供应链投毒 - 如果
composer.lock本身被恶意提交(比如 CI 被入侵后生成了带假shasum的 lock 文件),所有后续校验都建立在错误前提上 - 真正可信的起点是:只从官方 Packagist 添加仓库、禁用自定义
repositories、团队内严格 code review 每次composer.lock变更










