一个时代结束了:npm 终于对 install 脚本下手了

如果你是前端开发者。

每天大概率都会执行这样一条命令:npm install

看起来平平无奇。甚至已经成为肌肉记忆。

但很多人可能从来没意识到:当你敲下这条命令时。你的电脑其实正在执行陌生人写的代码。而且默认允许。

过去很多年,npm 一直有一个被业内吐槽的问题:install 竟然会自动执行脚本

例如:

json 复制代码
{
  "scripts": {
    "preinstall": "...",
    "install": "...",
    "postinstall": "..."
  }
}

只要依赖包里存在这些脚本。

执行:

bash 复制代码
npm install

npm 就会自动运行它们。

很多开发者第一次知道这件事时都会愣住。

等等...... 我只是安装一个包。为什么它能执行代码?

这可能是 npm 历史上最大的安全漏洞之一

过去几年。供应链攻击越来越疯狂。

攻击者最喜欢的方式之一就是:把恶意代码藏进安装脚本。

当开发者执行:npm install

恶意代码自动运行。读取环境变量。窃取 Token。上传 SSH Key。甚至直接感染 CI/CD。

很多安全研究人员一直在吐槽:npm 最大的问题不是下载了什么。而是安装时执行了什么。

而现在

npm 终于决定动刀了

根据 GitHub 发布的公告。

预计将在 2026 年 7 月发布的:npm v12

将彻底改变 npm install 的默认行为。

一句话概括:

text 复制代码
以前:
默认信任

未来:
默认拒绝

install 脚本默认禁止

这是本次最重磅的变化。

未来 npm v12 中:

text 复制代码
preinstall
install
postinstall

默认不会执行。

除非你主动批准。

否则:

bash 复制代码
npm install

只负责安装。不负责执行。

很多人看到这里可能会说:这不是很正常吗?

实际上。这在 npm 历史上是一次革命级变化。

因为过去十几年。自动执行安装脚本一直是默认行为。

现在终于变成:

text 复制代码
执行脚本
↓
需要显式授权

新增 approve-scripts 机制

为了兼顾安全和兼容性。

npm 推出了新的工作流:

bash 复制代码
npm approve-scripts

先查看有哪些包试图执行脚本。

然后选择:允许 或者:拒绝

最后把结果写入项目配置。

简单理解:

以前:

text 复制代码
任何依赖
↓
都能执行代码

现在:

text 复制代码
经过批准的依赖
↓
才能执行代码

影响最大的不是脚本,而是 Native 模块,很多开发者看到这里还没意识到问题有多大。

因为 npm 官方特别提到:

text 复制代码
node-gyp

也会被拦截。什么意思?很多原生模块:

  • sqlite
  • sharp
  • canvas
  • node-rs 系项目

安装时都需要编译。

而编译过程通常依赖:

text 复制代码
install
postinstall
node-gyp rebuild

未来如果没有授权。直接失败。

Git 依赖也要凉了

除了脚本。npm v12 还做了一件大事。

未来默认禁止:

json 复制代码
{
  "dependency": "github:user/repo"
}

或者:

json 复制代码
{
  "dependency": "git+https://..."
}

这样的 Git 依赖。如果需要。必须显式开启:

bash 复制代码
--allow-git

远程 URL 依赖同样被封

例如:

json 复制代码
{
  "dependency": "https://xxx.com/pkg.tgz"
}

未来也会被拦截。

需要:

bash 复制代码
--allow-remote

才能安装。

为什么 npm 突然这么激进?

因为过去一年。npm 生态几乎成了供应链攻击重灾区。各种恶意包层出不穷。很多攻击甚至不需要用户运行代码。

只要:

bash 复制代码
npm install

就已经中招。 这也是 GitHub 这次下定决心修改默认行为的原因。

这其实是在向 pnpm 和 Bun 学习

有意思的是。社区对此反应并不意外。因为很多开发者发现:其它现代工具早就在强化供应链安全。

Reddit 上不少开发者甚至表示:npm 终于补上了这块短板。 换句话说。npm 不是在创新。而是在补课。

现在就该开始准备

好消息是:不用等 npm v12。

官方已经提前给出了过渡方案。

升级到:

bash 复制代码
npm install -g npm@latest

确保版本:

text 复制代码
11.16.0+

之后正常执行:

bash 复制代码
npm install

npm 会提示:

哪些包未来会被拦截。

然后执行:

bash 复制代码
npm approve-scripts --allow-scripts-pending

即可提前检查风险。

为什么这件事值得所有前端开发者关注?

因为它改变的不只是 npm。而是整个 JavaScript 生态的安全模型。

过去:

text 复制代码
npm install = 下载代码 + 执行代码

未来:

text 复制代码
npm install = 下载代码
执行代码 = 需要授权

这是完全不同的思维模式。 某种程度上。

npm 正在从:默认信任 走向:Zero Trust(零信任)

最后

过去十五年。无数开发者习惯了:

bash 复制代码
npm install

然后什么都不想。但现实证明。这种便利背后隐藏着巨大的风险。

npm v12 的改变一定会带来兼容性问题。很多项目会踩坑。很多 CI 会报错。很多依赖需要调整。

但从长期来看。这可能是 npm 历史上最重要的一次安全升级。

因为从这一刻开始。JavaScript 世界终于不再默认相信每一个陌生依赖了。

官方文档 :github.blog/changelog/2...

你的项目里有多少包的安装脚本在默默运行?你认真看过吗?

转发这篇文章,提醒你的前端同事。


各位互联网搭子,要是这篇文章成功引起了你的注意,别犹豫,关注、点赞、评论、分享走一波,让我们把这份默契延续下去,一起在前端的海洋里乘风破浪!

相关推荐
console.log('npc')5 小时前
第 10 章 更多业务模块扩展
前端·人工智能·大模型
行者全栈架构师5 小时前
我用 TRAE Work 把桌游之夜搬进了浏览器:一个计分器的从创意到上线
前端·算法·架构
掘金者阿豪5 小时前
数据集成产品接上以后,报表为什么还是对不上?聊聊金仓 KFS 的落地细节
后端
山雀~5 小时前
线上CI流水打包失败排查思路案例
前端·ci/cd
tonydf5 小时前
人机协同定位一个越用越慢的疑难杂症
后端·ai编程
时间的情敌5 小时前
《回顾 2019 前端:React Hooks 问世,前端工程化爆发的一年》
前端·react.js·前端框架
燕落南枝5 小时前
CSS 类选择器详解:从入门到实战
前端·css
tryCbest5 小时前
Vue3——第 7 篇:组件基础——从注册到使用的完整流程
前端·javascript·vue.js
ai工具集合5 小时前
图标集用法,前端项目 SVG 图标 icon 完整接入实操
前端
门思科技5 小时前
ThinkLink 触发模型与告警规则实战:数据一小时才来一次,告警怎么做到不迟到、不刷屏、找对人
前端·后端