如大多数人所知,最近在项目中使用 npm 模块时发现了一个潜在的危险安全漏洞。总的来说,jQuery 基金会仍然认为这是一种安全且非常强大的做法,我们绝不是说您应该不再在您的 JavaScript 项目中使用 npm 进行包管理。我们想向 jQuery 插件开发人员和基金会中众多在 npm 上发布包的项目用户倡导,在安装包及其依赖项时要谨慎。
快速回顾
与其重新编写,不如直接查看 npm 博客 上的完整回顾和总结。
关注事项
接下来发生的事情正是我们撰写这篇博文的原因。Azer Koçulu 发布了许多 npm 包,其中一个就是 left-pad 包,这是一个简单的代码,许多其他包都依赖它。该包在取消发布后,许多流行项目开始出现构建失败,因为缺少该包。更令人担忧的是,任何人都可以取消发布您依赖的包,或者取消发布依赖项的依赖项的依赖项,从而给您或您的团队带来真正的麻烦。在 left-pad 被取消发布后不久,npm 团队决定取消取消发布它,并指定一个新的所有者来修复互联网上许多中断的构建。更令人担忧的是,一旦某个包被取消发布,任何人都可以获取您依赖树中某个位置的那些包名称,并将新的、可能是恶意代码推送到您的项目中。一般来说,这没什么大不了,因为您的包可能依赖于一个已取消发布的版本,并且不会拉取新的已发布版本。但是,许多人在安装依赖项时使用命令 npm i --save <package-name>
或 npm i --save-dev <package-name>
,默认情况下,它们会安装当时发布的最新版本,前面带有 ^
,如 ^1.0.0
,这告诉 npm 下次更新依赖项时安装任何更新的版本(包括次要版本)。这意味着,如果您重新安装或更新您的项目,并且有人将恶意代码推送到补丁 (1.0.1) 或次要 (1.1.0) 版本(以我们的示例为例),它将自动安装到您的项目中。
建议
我们的主要建议是谨慎。了解您要安装的内容,了解您的依赖项及其依赖项的依赖项在安装什么。您现在应该仔细检查您的项目,看看您依赖的任何模块是否已被取消发布,以及它们是否在 此列表 中,并且是否最近发布了您可能希望避免的新版本,直到您验证它是安全的。虽然我们还没有直接与他们交谈,但我们相信 npm, inc. 的工作人员正在努力解决这些问题,但在那之前,请保持警惕,保护您的项目和插件的安全。我们一直相信,JavaScript 现在并且将来仍然是开发从个人博客到企业级应用程序的各种事物的最强大的选择之一。对于任何技术,我们都会遇到一些挫折,但只要我们从中吸取教训,并将这些知识保留在前进的道路上,JavaScript 将会胜出。