Composer allow-plugins 必须在每个项目 composer.json 中显式配置,全局设置无效;CI/CD 必须加 --no-plugins 参数;白名单仅允许注册,不保证插件生效,还需额外配置如 extra.symfony.allow-contrib 或 phpstan.neon。

团队共享 Composer 白名单配置,不能靠全局设置“一劳永逸”,必须在每个项目 composer.json 的 config.allow-plugins 下显式声明可信插件,且格式零容错。
为什么全局 config 不起作用
Composer 的 allow-plugins 是逐项目生效的,composer global config 设置的白名单对任何项目都无效。团队里有人执行 composer install 时仍会报 “Plugin xxx is not allowed”,就是因为项目级 composer.json 里压根没写这一项。
- 全局配置只影响
composer self-update或composer diagnose等非项目命令 -
composer install和composer update只读当前目录下的composer.json中的config.allow-plugins - 哪怕你用
composer create-project拉脚手架,模板若没带该字段,新项目照样拦截插件
标准白名单模板(含常见插件)
以下内容可直接复制进项目 composer.json 的 config 对象内,注意缩进与逗号规则:
"config": {
"allow-plugins": {
"symfony/flex": true,
"phpstan/extension-installer": true,
"dealerdirect/phpcodesniffer-composer-installer": true,
"ocramius/package-versions": true
}
}
- 每行末尾不能有逗号(JSON 标准),最后一项后也别加
- 包名必须全小写、带 vendor,例如
"symfony/flex"✅,"Symfony/Flex"❌ - 不要写
"*": true或"vendor/*"—— Composer 完全不识别通配符 - 如果项目不用 Flex,就删掉那一行;多一个没授权的条目不会出错,但少一个会导致安装中断
CI/CD 环境必须加 --no-plugins
生产构建阶段不允许任何插件运行,这是硬性安全边界。白名单只解决本地开发和测试环境的“能装”,不解决“该不该执行”。
- CI 脚本中必须固定写死:
composer install --no-plugins --no-scripts --no-dev --prefer-dist -
--no-plugins必须放在install命令前,composer --no-plugins install是错的(等价于composer --help) - 即使你已在
composer.json里白名单了所有插件,CI 里不加--no-plugins,仍可能被恶意依赖链利用(比如某 dev-only 包悄悄带二级插件)
最容易漏掉的校验点
白名单只是“允许注册”,不代表插件真会启用或生效。很多团队卡在这一步却以为配置完成了:
-
symfony/flex白名单通过后,还需检查extra.symfony.allow-contrib是否开启,否则 contrib bundle 不加载 -
phpstan/extension-installer允许后,得确认phpstan.neon里写了extensions:引用,否则静态分析不触发 -
post-install-cmd脚本不受allow-plugins控制——它属于scripts字段,禁插件后照常执行,别误以为“禁了插件就等于禁了所有钩子”











