必须同时使用--no-scripts和--no-plugins,否则无法阻断恶意脚本或插件执行;二者缺一不可,是生产、CI及审计场景的强制安全基线。

必须加 --no-scripts --no-plugins,否则无法阻止恶意脚本执行。 这不是可选项,是生产、CI、审计等场景的强制安全基线。只加 --no-scripts 不够——插件可能绕过 scripts 字段注入钩子;只加 --no-plugins 也不行——项目级脚本仍会照常运行。
为什么 --no-scripts 单独用不安全
第三方包的恶意逻辑不一定写在 post-install-cmd 里。有些包通过 Composer 插件(如 phpstan/extension-installer)注册自己的生命周期事件,这些事件不受 --no-scripts 控制。更隐蔽的是,某些插件会在 PluginInterface::activate() 中直接执行代码,连钩子都不走。
常见错误现象包括:
- CI 构建日志里没看到
Running script,但vendor/下凭空多出shell.php或.env.local - 部署后发现数据库被插入异常记录,溯源发现是某个插件的
Installer类在install()阶段调用了exec("curl ...") - 安全扫描工具报出
system()调用路径,但composer.json的scripts字段为空
--no-plugins 必须和 --no-scripts 同时出现
从 Composer 2.2 开始,allow-plugins 白名单机制成为核心防线,但它默认只在首次安装时生效。后续运行 composer install 时,若未显式禁用,插件仍会被加载并执行。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
正确做法是:
- 始终使用
composer install --no-scripts --no-plugins,而非只加一个参数 - 在
composer.json中显式声明白名单:"allow-plugins": { "phpstan/extension-installer": true },避免依赖全局配置 - CI 环境中额外设环境变量:
COMPOSER_ALLOW_PLUGINS=0,双重保险
注意:--no-plugins 会跳过所有插件激活逻辑,包括 composer/installers ——这意味着自定义安装路径(如 library/)可能失效,需提前确认是否影响项目结构。
脚本没执行 ≠ 安全了:容易忽略的残留风险
即使加了双 --no- 参数,仍有三类风险不会被拦截:
-
vendor/bin/下的可执行文件(如phpunit、php-cs-fixer)仍存在,它们本身可能是恶意包提供的二进制 - 某些包在
autoload的files段直接引入 PHP 文件,这些文件会在自动加载时无条件执行(例如"files": ["src/init.php"]) -
composer.lock中记录的包版本若已被篡改(如 fork 仓库提交了带后门的 patch),即使脚本不运行,恶意代码已静态存在于vendor/
真正麻烦的不是参数怎么加,而是得知道哪些包动了 exec、写了文件、或在 autoload 里埋了初始化逻辑——这些行为不会报错,也不会出现在日志里,但会让下一次 php artisan serve 或 php index.php 直接触发。

















