如何在NodeJS中限制模块访问

3
在Node中,是否有一种方法可以限制特定模块对其他模块的访问权限或者只允许特定模块对其他模块进行访问? 我应该替换全局作用域中的require函数和require对象吗? 基本上,我不信任某个特定的模块。它可能包含恶意代码,我想保护我的服务器免受其影响。这个想法类似于Java策略,您可以基于命名空间来限制访问。 编辑:我找到了一种方法来解决这个问题,并将解决方案发布在npmjs.org上,名称为require-shield。https://www.npmjs.com/package/require-shield

1
也许你可以不使用那个特定的模块。 - TGrif
TGrif所说的。 为什么您会使用不信任的模块,然后试图发明一些复杂的方式来防止自己使用它? - gforce301
根据定义,我不信任我自己没有编写的模块... 我希望有一种比手动审查每个所需模块中的代码更自动化的方式来保护我的服务器免受恶意代码的侵害。 - 4thex
我也在寻找一种安全地运行用户提供代码的方法。 - 4thex
3个回答

3

在Node中有没有一种方法可以限制访问或仅允许从特定模块访问某些其他模块?

没有。没有这种方法。

我应该替换全局范围中的require函数和require对象吗?

那样并不能防止访问。任何恶意代码仍然可以使用 fs.readFile()eval() 来运行他们想要的任何外部代码。

我基本上不信任一个特定的模块。它可能有恶意代码,我想保护我的服务器免受其影响。

保护服务器免受恶意代码影响的唯一方法是在外部进程中运行它,并非常仔细地控制该外部进程具有的权限(例如,将其放置在仅具有基本权限的自己的用户帐户中)。最安全的方式是在完全与服务器隔离的VM中运行不受信任的代码。

还有node.js VM,它在不同的Javascript实例中运行代码,因此外部代码无法干扰您服务器的Javascript环境。虽然这确实保护了您的Javascript代码不受其他Javascript代码的影响,但它并未提供在实际VM中运行外部代码所提供的完整系统保护(例如,不受信任的代码仍然可以访问您的文件系统和其他系统资源)。


1
@4thex - 有很多方法可以解决这个问题。例如,他们可以启动一个新的node.js实例作为子进程,在那里运行他们的代码,你就无法控制该实例。或者,他们可以下载一个本地代码模块,实现自己对文件系统的访问。而且,这两个选项只需要大约一分钟的时间思考。node.js拥有广泛的API,几乎可以做任何事情。它根本不是为了控制不受信任的代码而设计的。 - jfriend00
1
@4thex - 你是如何替换 require() 的?这并不像简单的重新分配那样简单。每个模块都会传递一个不同的 require() - jfriend00
1
@4thex - 你在意代码是否可以在几分钟内轻松破解吗? - jfriend00
@4thex - 钩取 replace() 的常见原因是为像 webPack 这样遵循正常规则的代码提供新功能,而不是防止您试图防止的内容。 对于我可以看到的第一种方法,请查看此处的实现:https://github.com/nodejs/node/blob/master/lib/module.js#L606。 - jfriend00
@4thex - 如果还不够清楚,只需要这样做:const fs = module.constructor._load('fs'); - jfriend00
显示剩余5条评论

1
在Node中,有没有一种方法可以限制访问或仅允许从特定模块访问某些其他模块?
Node.js v20随附了一个实验性的权限模型,可以做到非常接近您想要做的事情。如果您使用--experimental-permission选项运行脚本:
node --experimental-permission index.js

这将阻止所有文件系统访问,您可以使用--allow-fs-read--allow-fs-write标志来允许访问特定目录或文件。例如:

node --experimental-permission --allow-fs-write=/tmp/ index.js

--allow-fs-write=/tmp/ 可以让你的程序仅访问 /tmp/ 目录。


0

同时,离线系统上的可靠性更高,因此,使用容器/虚拟化来隔离Javascript进程将是您想要的下一步。

如果您真的想深入了解Javascript的可能性,还有node vm2,它声称能够运行不受信任的代码,而不像官方的Node.js VM。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接