composer 加自定义 repositories 会彻底关闭 packagist.org 注册校验,清空 repositories 块、禁用 composer_repo_packagist、配置官方源、启用 allow-plugins 白名单、校验 composer.lock 与 audit 是关键防护措施。

Composer 默认只走 packagist.org,但一旦你加过任何自定义 repositories,它就自动放弃对包是否在官方索引中注册的校验——哪怕只是加了个空配置,也会让所有 require 绕过官方源检查,直接去私有源找包。这是最常被忽略的安全缺口。
清空或禁用非官方 repositories 是最有效的源头控制
只要 composer.json 里存在 repositories 字段(包括 "type": "package"、"type": "vcs" 或任意 URL),Composer 就不再验证包是否在 packagist.org 上注册过。这不是“多一个备选”,而是“彻底切换模式”。
- 删掉
composer.json中整个repositories块(不是注释掉,是物理删除) - 确认没设置环境变量
COMPOSER_REPO_PACKAGIST,它会覆盖默认源:运行env | grep COMPOSER_REPO_PACKAGIST检查 - 全局配置里也别留后门:执行
composer config --global repo.packagist false,再显式加回官方源:composer config --global repo.packagist '{"type": "composer", "url": "https://packagist.org"}' - CI 流水线中建议加一步校验:
composer config --list | grep -q "repo\.packagist.*https://packagist.org",失败则中断
secure-http=true 不等于包来源可信,但它能拦住不合规镜像
secure-http=true(默认开启)只强制元数据(如 packages.json)必须通过 HTTPS 加载,并校验 X-Content-Signature 头。但它不阻止 dist 包本身从 HTTP 下载,也不验证包内容是否被篡改。
- 国内镜像若未同步签名逻辑(如旧版
https://packagist.phpcomposer.com),就会报The contents of ... do not match its signature错误 - 优先换用明确支持签名转发的镜像,例如阿里云:
composer config --global repos.packagist composer https://mirrors.aliyun.com/composer/ - 绝不要设
disable-tls=true——这会跳过 HTTPS 证书校验,中间人攻击风险直线上升 - 注意:
secure-http对dist.url无效;如果某个包的dist.url是http://开头,2.2+ 版本已默认拒绝,但老版本或插件可能绕过
allow-plugins 白名单才是防供应链攻击的关键防线
很多恶意行为发生在安装阶段:插件自动执行 hook,下载远控脚本、注入后门。Composer 2.2+ 的 allow-plugins 机制默认禁止所有插件,必须显式授权才能启用。
- 全局禁用所有插件:
composer config --global allow-plugins false - 或按需白名单:
composer config --global allow-plugins '{"phpstan/extension-installer": true, "yiisoft/yii2-composer": true}' - 首次运行
composer install时,会被动提示哪些插件被拦截;此时别直接敲y,先查清插件用途和维护者 - 生产环境 CI 中应加
--no-plugins参数,彻底关闭插件执行能力
composer.lock + composer audit 是落地可信的最后一环
composer.lock 记录了每个包 dist 归档的 SHA-256 哈希值,是防止下载时被中间篡改的底线保障;而 composer audit 能识别已知 CVE,但它不检测新投毒包。
- 必须把
composer.lock提交进 Git,且部署时只用composer install(不是update) - CI 中加入:
composer audit --no-dev --format=json | jq -e '.advisories | length > 0' >/dev/null && exit 1 || exit 0 - 人工核验不能少:安装后运行
composer show vendor/name --all,确认sourceURL 是可验证域名(如github.com/laravel/framework),而非裸 IP 或短链 - 别信“最新版最安全”——有些包最近 commit 时间是 3 年前,star 数为 0,却突然发了个 v1.0.0,这种要重点盯











