我通过 npm 包管理器使用许多 Node.js 模块。既然这些模块不是由受信任的组织开发的,那么它们值得信赖吗?
不知道npm团队是否对开发者提交的每个模块都做了安全检查。
NPM 不进行任何检查。它们只是一个注册表。 整个事情建立在对开发社区的信任和共享的基础上。
大多数节点模块都是开源的,您可以在其存储库(通常是 Github)中查看它们的代码。 所以这是“信任”他们的最佳方式。 某些节点模块为您提供预构建的本机二进制文件,因此这在某种程度上可能会带来更大的风险,但如果它很流行(例如 ws),那么我认为没有问题。 您还可以检查 NPM 发布者用户,有时是 Oracle 等知名公司。
这个想法是找到最流行的
npm
模块。您可以通过检查每个项目的星级来做到这一点。
一些提示:
使用 npm 来管理开发环境中的依赖项,但不能管理部署脚本中的依赖项。
像npm这样的工具是开发工具。它们是下载和更新模块的便捷方式。它们不是部署工具,从来都不是部署工具,也不应该用于部署!
在开发存储库中使用
并签入结果。这会将您的模块版本锁定到位,包括子依赖项npm shrinkwrap
更多详情这里
更新 - 2019 年 6 月
npm@6 中包含安全检查。 您可以运行
npm audit
来递归分析依赖关系树,以识别已知不安全的模块。
2016版
您可以使用
nsp
提供的Node Security Platform
工具,它有助于审核package.json中的所有模块
npm install nsp --global
nsp check
npm 提供了一些程序,可以针对您的 package.json 运行并检查已知漏洞。 并不完美,但却是一个良好的开始。 我用过的那个叫做 nsp 但还有其他的。
它不太安全,因为这些模块不是由像 php/apache 那样的任何组织开发的,但是它是很好的技术,您也可以使用
nsp
模块来检查节点模块中的安全问题。
是的!几乎所有节点模块都是开源的,因此您可以实际查看模块后面运行的代码片段。这可能会帮助您建立对您愿意在应用程序中使用的软件包的信任
其实我用的包不多:
1)快递
2)body & cookie-parser(有时我懒得写中间件),
3)猫鼬,
4)哈巴狗,
5)请求,
6) 异步,
7) 洛达什,
8) 字符串
所有其他东西我自己编写并放入“组件”文件夹中。
假设大多数人都懒得这么做:
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
,它允许您在使用node
、npm
和yarn
时使用原生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
脚本和其他方式危害您的系统。