2

关于如何从 nodejs 模块中删除全局上下文的任何想法?

我不是在寻找以下问题的解决方案,但是如果您需要更多上下文,请前往。

我正在开发一个项目,我的用户可以上传他们自己的 nodejs 模块,如果它符合预定义的框架,它将在一天中定期运行。显然,这是一个主要的安全问题。一个好的 90% 解决方案只是删除全局上下文。

4

1 回答 1

5

如评论中所述,您确实需要在单独的进程中运行用户提供的模块,因为无限循环将冻结任何节点进程。

您应该从VM模块开始:

  • 读取文件内容(使用fs.readFile,而不是require)。
  • 定义一个新的全局对象。您可以选择公开您想要的任何内容(并隐藏其余内容)。
  • 运行用户代码。

这是一个例子:

var fs = 要求('fs'),
    vm = 需要('vm');

函数运行代码(文件名){
  var 代码 = fs.readFileSync(fileName),
      沙箱 = {
        控制台:控制台,
        设置超时:设置超时,
        清除超时:清除超时,
        要求:要求,
        模块:模块,
        出口:出口,
        过程:过程,
        缓冲区:缓冲区
      };

  vm.runInNewContext(代码,沙箱,文件名);
}

用户提供的代码将能够访问我在沙箱中传递的所有内容,就好像它在全局范围内一样。在我的例子中,我选择从真正的 node.js 全局范围中公开几乎所有内容。您可以选择不公开的内容。

此外,如果您希望您的解决方案安全,您应该检查child_process.spawn 。

于 2012-12-22T00:25:32.503 回答