Composer update –no-scripts 更新时不执行钩子脚本【安全】

1次阅读

composer update –no-scripts 能提升安全性,因为它跳过 composer.json 中 scripts 段定义的自动执行钩子(如 post-update-cmd),防止第三方或污染包内嵌恶意 php 代码在依赖更新时静默运行。

Composer update –no-scripts 更新时不执行钩子脚本【安全】

为什么 composer update --no-scripts 能提升安全性

因为 Composer 的 scripts 段定义的钩子(如 post-update-cmdpre-install-cmd)会在更新过程中自动执行任意 PHP 代码,而这些脚本可能来自第三方包或被污染的 composer.json。关闭它们可避免恶意逻辑在依赖拉取阶段悄悄运行。

常见风险场景包括:

  • 从非官方源安装的包,其 composer.json 内嵌了下载并执行远程 payload 的 post-autoload-dump
  • 团队协作中,某成员误提交了调试用的 pre-update-cmd,本地执行时删库或改配置
  • CI/CD 流水线未隔离环境,scripts 调用了开发机专属命令(如 php artisan optimize),导致构建失败或泄露凭证

--no-scripts 不影响哪些行为

它只跳过 scripts 定义的钩子,其余核心逻辑照常运行:

  • 仍会解析 composer.lock、计算依赖图、下载新版本包到 vendor/
  • 仍会重写 autoload.php 和生成类映射(除非你同时加了 --no-autoloader
  • 仍会校验包签名(如果启用了 composer config secure-http true

注意:--no-scripts 不等于「跳过所有副作用」——比如某些包的 install 阶段通过 bin 目录注册可执行文件,这个不受影响。

什么时候必须用 --no-scripts

以下情况建议强制添加该参数:

  • 在生产服务器上执行 composer update 前,尤其当 composer.json 来自不可信分支或 PR
  • 审计第三方包时,想确认更新本身是否干净,排除脚本干扰
  • 调试依赖冲突,怀疑是某个 post-install-cmd 修改了 vendor/autoload.php 导致类加载异常
  • 使用 composer install --no-dev 部署时,顺带加上 --no-scripts 避免开发专用钩子触发

容易忽略的兼容性细节

--no-scripts 是全局开关,无法按钩子类型精细控制。这意味着:

  • 即使你只想禁用 post-update-cmd,它也会一并跳过 pre-autoload-dump 等所有类型
  • 某些框架(如 laravel)依赖 post-autoload-dump 生成优化后的类映射,关掉后可能轻微影响首次请求性能
  • 如果你在 composer.json 中写了 "scripts": {"auto": "echo hello"} 并手动运行 composer run auto--no-scripts 对这种显式调用无效

真正危险的是自动触发的钩子,而人手敲的命令不在它的作用域里。

text=ZqhQzanResources