我们如何信任 npm 模块?

How can we trust npm modules?

我通过 npm 包管理器使用了很多 Node.js 模块。由于这些模块不是由受信任的组织开发的,它们是否值得信赖?

不知道npm团队有没有对开发者提交的每个模块做安全检查

NPM 不做任何检查。它们只是一个注册表。 整个事情是建立在对开发社区的信任和分享的基础上的。

大多数节点模块都是开源的,您可以在其存储库中查看它们的代码(通常 Github)。 所以这是 'trust' 他们的最佳方式。 一些节点模块为您提供预构建的本机二进制文件,因此在某种程度上可能风险更大,但如果它很流行(例如 ws),那么我认为没有问题。 您还可以检查 NPM 发布者用户,它有时是像 Oracle 这样的知名公司。

想法是找到最受欢迎的 npm 模块。您可以通过检查每个项目上的星星来做到这一点。

一些提示:

Use npm to manage dependencies in your dev environment, but not in your deployment scripts.

像 npm 这样的工具是开发工具。它们是下载和更新模块的便捷方式。它们不是部署工具,从来不是部署工具,也不应该用于部署!

Use npm shrinkwrap in the development repository and check in the result. This will lock your module versions in place, including sub-dependencies

更多详情here

如果您正在安装您不信任的软件包,您可以通过 运行

来避免此漏洞

npm install --ignore-scripts

有关详细信息,请查看 here

这是一个很棒的博客,可以给你清晰的画面blog

npm 提供了一些程序,它们可以 运行 针对您的 package.json 并检查已知漏洞。不完美,但一个好的开始。我用过的那个叫做 nsp 但还有其他的

更新 - 2019 年 6 月

在 npm@6 中包含安全检查。 您可以 运行 npm audit 递归分析您的依赖关系树,以明确识别不安全的地方

2016版

您可以使用 Node Security Platform 提供的 nsp 工具,它有助于审核 package.json

中的所有模块
npm install nsp --global
nsp check

是的!几乎所有节点模块都是开源的,因此您实际上可以查看模块后面的代码片段 运行。这可能会帮助您建立对您愿意在应用程序中使用的包的信任

它不太安全,因为这些模块不是像 php/apache 那样由任何组织开发的,但是这是很好的技术,您也可以使用 nsp 模块来检查安全问题你节点模型。

其实我用的包不多:

1) 快递
2) body & cookie-parser (有时候懒得写中间件),
3)猫鼬,
4)哈巴狗,
5) 请求,
6) 异步,
7) lodash,
8) 字符串

我自己写的所有其他东西都放在 "components" 文件夹中。

假设大多数人都懒得这样做:

  const md5 = require('md5');
  let data = 'something';
  data = md5(data);

但我用 crypto 来做(它默认包含在所有 nodejs 版本中):

  const crypto = require('crypto');
  let data = 'something';
  data = crypto
           .createHash('md5')
           .update(data.toString())
           .digest('hex');

我坚持不使用包的逻辑:

1) 如果包裹很小(如果我不知道包裹,我总是阅读包裹文件)
2) 版​​本不高于 1.0.0 (不保证会更进一步)
3)存储库中没有最近的迭代(提交)

顺便说一句 nsp check 我的申请说:(+) No known vulnerabilities found (:

我制作了 node-safe,它允许您在使用 nodenpmyarn:

时使用本机 macOS 沙箱
# Allow reading files, but only in the current folder
node --enable-sandbox --allow-read="./**" myscript.js

# Run npm with sandbox (can only write to `./node_modules` by default)
npm --enable-sandbox install got 

使用沙盒包管理器时,流氓依赖项无法再通过 postinstall 脚本和其他方式危害您的系统。