--no-plugins 是必须参数而非可选,因为插件在 composer 构建流程中默认自动加载执行,只要命令未显式指定 --no-plugins,就会扫描 vendor/、解析 composer.json 中的插件声明并调用 activate(),导致任意代码静默运行。

为什么 --no-plugins 不是可选,而是必须加在每条命令末尾
因为插件执行不是“按需触发”,而是 Composer 构建流程的默认环节。只要命令没显式带上 --no-plugins,它就会扫描 vendor/、读取每个包的 composer.json 中 extra.plugin 或 type: composer-plugin 字段、调用 PluginInterface::activate()——哪怕你根本没手动装过插件,只要依赖树里带一个旧版 hirak/prestissimo 或魔改过的 phpunit/phpunit,就可能静默执行任意 PHP 代码。
composer install --no-plugins ✅ 正确:跳过整个插件生命周期,连 vendor/composer/autoload_plugins.php 都不会生成composer --no-plugins install ❌ 错误:等价于 composer --help,参数被忽略,插件照常加载
- CI 脚本若封装了
bin/composer,必须确认该脚本未默认注入--plugins或其他 flag - 环境变量
COMPOSER_NO_PLUGINS=1可作备用,但优先级低于命令行参数,且部分旧镜像未启用 - Composer 2.2+ 默认拒绝插件,但这个“默认”只影响
allow-plugins白名单行为,不改变命令执行时的插件加载逻辑
插件代码早已随包一起下载完毕,禁止下载不能规避风险
所谓“禁止自动下载恶意插件”是个伪命题。插件不是运行时才拉取的远程资源,而是随 composer install 解压到 vendor/ 后立即参与构建流程。真正危险的是安装/更新时的自动执行——PluginInterface::activate() 被调用那一刻,它就能修改 autoloader、劫持下载器、注入钩子、写入敏感路径。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 插件拥有项目构建期的完整代码执行权,不是“辅助工具”,而是构建链路的一部分
-
allow-plugins是白名单开关,设为true等同于关掉安全闸门,任何传递依赖里的插件都能悄悄运行 - 通配符如
"*/*"不被支持,白名单必须写具体包名,例如"symfony/flex": true
生产环境部署必须组合使用 --no-plugins 和 --no-scripts
--no-scripts 只关掉 composer.json 里 scripts 字段定义的钩子;但插件能绕过这个字段,直接注册新钩子(比如 symfony/flex 就会在 post-install-cmd 外额外挂载自己的逻辑)。单加 --no-scripts 不够,--no-plugins 必须同步启用。
-
composer install --no-plugins --no-scripts --no-dev --prefer-dist是生产环境推荐最小安全组合 - 顺序不能错:
composer --no-plugins install是无效写法,--no-plugins必须紧跟命令动词之后 - 该组合不影响
vendor/autoload.php生成,也不阻止依赖下载解压,只切断“执行链”
离线环境更需要 --no-plugins,否则 COMPOSER_DISABLE_NETWORK=1 也救不了你
离线安装必须设 COMPOSER_DISABLE_NETWORK=1,否则哪怕 vendor/ 完整、composer.lock 一字未改,也会卡在 Loading composer repositories 或报 Could not fetch。但即使网络被禁,插件仍可能在本地触发——比如某个包自带的插件会尝试读取 /etc/passwd、调用 exec('id')、或检查当前是否在 CI 环境中再决定是否外连。
-
COMPOSER_DISABLE_NETWORK=1阻断网络请求,但不阻断插件本地执行 - 离线机上运行
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts才是真正可控的校验流程 - 别信
--offline:它只跳过元数据更新和 dist 下载,挡不住初始packages.json请求,也不是合法参数
最容易被忽略的点是:插件加载发生在 autoload 之前,且不依赖任何外部配置文件——只要包存在、类型匹配、接口实现完整,activate() 就会被无条件调用。安全边界不在“有没有插件”,而在“有没有明确禁止执行”。










