GitHub官方博客宣布,nnpm v12大版本更新即将于2026年7月推出。这个版本引入了多项安全相关的默认行为变更,所有这些变更目前已在npm 11.16.0或更高版本中以警告形式提供,让开发者有时间在正式升级前做好准备。

三项核心安全变更
npm v12将此前可以自动运行的安装行为全部改为需要显式授权才能执行:
第一项变更是allowScripts默认为off。从现在开始,npm install将不再自动执行依赖包中的preinstall、install或postinstall脚本,除非在项目中明确允许。这包括原生的node-gyp构建——即使用包有binding.gyp但没有显式的install脚本也会被阻止,因为npm会为其运行隐式的node-gyp rebuild。Git、file和link依赖的prepare脚本也将以同样方式被阻止。
第二项变更是--allow-git默认为none。npm install将不再解析Git依赖(直接依赖或传递依赖),除非通过--allow-git显式允许。这堵住了一个代码执行路径漏洞——即使使用--ignore-scripts,Git依赖的.npmrc仍可能覆盖Git可执行文件。这项变更此前已在2026年2月18日宣布,并于npm 11.10.0+版本中提供。
第三项变更是--allow-remote默认为none。npm install将不再解析来自远程URL的依赖(如直接依赖或传递依赖中的https tarball),除非通过--allow-remote显式允许。该标志从npm 11.15.0开始可用。值得注意的是,相关的--allow-file和--allow-directory标志在v12中不会改变默认行为。
如何准备升级
GitHub建议所有开发者按以下步骤做好准备:首先升级到npm 11.16.0或更高版本,然后正常运行install并仔细审查警告信息。接下来运行npm approve-scripts --allow-scripts-pending命令,查看哪些包包含脚本,只批准你信任的包(npm approve-scripts),其余的用npm deny-scripts阻止。最终的允许列表会被写入package.json并应该提交到代码库。完成这些步骤后,一旦升级到v12,只有你批准的脚本会继续运行,未批准的都将停止。
如果你在安装过程中需要运行脚本,可以在npm 11.16.0+版本中观察到相应的警告。更多详细信息可以在npm approve-scripts、npm deny-scripts和allow-scripts config的官方文档中查看。
安全加固的背景
这些变更的核心逻辑是:默认拒绝,按需授权。npm团队在博客中指出,这些变更将此前可以自动运行的安装行为转换为需要显式 opt-in 的行为,这反映了供应链安全的基本原则——不给潜在的恶意代码自动执行的机会。
特别是--allow-git和--allow-remote的变更,直接针对的是通过Git依赖和远程URL进行代码注入的攻击面。此前即使使用--ignore-scripts,Git依赖的.npmrc仍可能被攻击者利用来执行恶意代码。这类攻击向量在近年来通过npm生态进行的供应链攻击中并不罕见。
对开发者工作流的影响
对于大多数Node.js项目而言,这些变更意味着需要重新审视package.json和依赖配置。如果你的项目依赖于某些包的postinstall脚本来完成native模块的构建,或者依赖于git分支依赖来获取最新代码,需要提前在package.json中显式声明这些依赖。
GitHub建议开发者在正式环境升级npm v12之前,先在CI/CD流水线中测试11.16.0+版本,观察警告信息并调整配置。这将确保升级过程平滑,不会因为新的默认行为导致构建失败。
参考来源:https://github.blog/changelog/2026-06-09-upcoming-breaking-changes-for-npm-v12/