composer默认不校验包签名,必须显式启用security.signature-verification true并配置https镜像为元数据代理(repos.packagist),才能实现“元数据加速+官方签名验证”的安全组合;仅换源或仅开https无法防止镜像污染导致的供应链攻击。

Composer默认不校验包签名,HTTPS只是传输层防护
仅靠 HTTPS 协议本身不能防止中间人攻击对 Composer 依赖的篡改。HTTPS 只保证 packages.json 和 .zip 文件在传输中不被窃听或篡改,但无法验证这些文件是否来自 Packagist 官方、是否被镜像站缓存污染或被恶意替换。Composer 2.2+ 默认关闭签名验证,security.signature 配置项默认为 false,这意味着即使你用 HTTPS 访问阿里云镜像,也会静默跳过完整性校验。
为什么换 HTTPS 镜像源反而可能更不安全
执行 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 后,Composer 会把所有元数据和包下载都走镜像——而主流镜像站(如阿里云、腾讯云)不提供 composer-signature 字段,导致签名验证彻底失效。此时攻击者只要污染镜像缓存,你运行 composer install 拉下来的 vendor/ 就是已被篡改的代码。
- 镜像 URL 必须以
/结尾,否则路径拼接错误返回 404 - 配置项名是
repos.packagist,不是repos.packagist(多一个s会被静默忽略) -
composer diagnose输出中必须同时出现secure-http: OK和signature verification: OK才算生效
安全加速的正确姿势:HTTPS 镜像只代理元数据,包文件仍走官方校验链路
Composer 2.5+ 支持“元数据代理 + 官方签名”模式,核心是分离元数据请求和包文件下载:元数据(packages.json 等)走 HTTPS 镜像提速,包文件(.zip)仍从 packagist.org 或其带签名的 CDN 下载,并强制校验签名。
- 先禁用默认兜底行为:
composer config -g repos.packagist false - 再添加元数据代理:
composer config -g repos.packagist.type composer和composer config -g repos.packagist.url https://mirrors.aliyun.com/composer/ - 最后启用签名验证:
composer config -g security.signature true - 验证是否生效:
composer show --security输出含Signature verification: enabled
生产环境必须同步加固 vendor 目录访问控制
即使签名验证开启,若 vendor/autoload.php 被 Web 服务器直接暴露,攻击者仍可通过请求触发 PHP 解析错误泄漏绝对路径,或利用旧版自动加载器 dump 类映射结构。这不是 HTTPS 能解决的问题,而是部署层漏洞。
- Nginx 配置必须包含:
location ^~ /vendor/ { return 403; } - Apache 必须启用
.htaccess并确保AllowOverride All生效 - Web 根目录(DocumentRoot)只能是
public/,vendor/、src/、composer.json全部置于其外 - CI/CD 流水线中严禁
cp -r vendor public/这类操作











