一个时代结束了: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...

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

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


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

相关推荐
撑死胆大的1 小时前
2026开发变局:国标落地后,软件开发彻底换赛道
前端·低代码·ai·大模型
damaoyou1 小时前
Cog3DRangeImagePlaneEstimatorTool完全指南
后端
Nturmoils1 小时前
分页别写太顺手,LIMIT 背后还有排序和边界
数据库·后端
悟空瞎说1 小时前
最新 React Native 推送通知完整实战指南
前端
GuWenyue1 小时前
前端异步请求踩坑?3种方式搞定Ajax数据交互,从XHR到async/await
前端·javascript·设计模式
神奇小汤圆1 小时前
国产版“Codex”初体验,智谱ZCode很强啊!
后端
站大爷IP1 小时前
Python里的“赋值”到底是什么意思?
后端
李白的天不白1 小时前
pnpm 启动前端项目
前端