PHP使限制用户在服务器上可以做的事情相对容易——只需通过PHP.ini disable_functions指令指示它禁用功能即可。Node.js中有类似的功能吗?在谷歌上搜索一些更明显的短语却变成了一片空白。我想人们可以通过控制requires子句中的内容来做类似的事情。然而,也许还有另一种方法呢?我非常感谢任何能够为我指明正确方向的人。
从评论来看,我需要澄清这个问题
- Context-我正在设置一个服务,允许用户在Docker容器中运行自己的Node代码。Docker容器相当安全,但正如Docker明确表示的那样,无法保证容器是一个没有任何溢出风险的沙盒
- 出于某种原因,我希望允许用户使用外部模块,这些模块的使用在他们的代码中使用标准的Node require("module name")语法声明
现在假设我让这种情况发生,并且用户坚持
require('shelljs/global');
轰。。。用户能够运行shell命令。那么我该如何阻止这种情况的发生呢?一种方法是扮演警察,严格控制用户可以通过这种方式接入哪些外部模块。另一个——因此也是我的问题——如果有一种php.ini风格的方法可以简单地阻止对某些功能的访问。根据我对Node工作方式的理解(目前还不完善),这是不可能的。然而,考虑到我是一个相对新手,我想我会在这里问一下,看看那些比我更了解Node的人会说些什么。
我不知道你的意思,但你可以控制你从模块导出中导出的内容。例如:
var DB = require("db");
var userFromDB = DB.find("username");
modules.exports = {
publicUser: userFromDB.publicData
}
我们只公开了userFromDB.publicData
,而不是整个userFromDB
对象。公众中没有人可以访问其他任何内容。
防止一个攻击角度的一种方法是在运行node.js之前,将shell中的全局node_modules
路径文件夹设置为与默认文件夹不同的文件夹。
然后,你可能会遇到一些实际需要全局模块的应用程序的问题,但你可以npm link
它们或类似的应用程序。