运行不受信任的用户代码时,阻止Node.js中的系统调用

时间:2014-03-22 02:41:49

标签: javascript node.js user-defined-functions

我目前正在考虑在节点中运行用户提供的代码的问题。我有两个问题:

  1. 用户脚本不得读取或写入全局状态。为此,我假设我可以简单地生成一个新进程。还有其他考虑因素吗?我是否必须以某种方式隐藏孩子的父进程,或者孩子是否无法通过父进程阅读,书写或以其他方式玩弄?
  2. 用户脚本不得对系统执行任何操作。所以,我正在考虑禁止任何系统调用。我该如何实现这一目标? (注意,如果我可以禁止处理模块,那么第1点也应该修复,不是吗?)

1 个答案:

答案 0 :(得分:3)

您正在寻找runInNewContext模块(vm documentation)中的vm功能。

使用此功能时,它会创建非常有限的上下文。您需要将所需的任何内容传递到沙箱对象中,沙盒对象将成为全局对象。例如:如果您希望不受信任的代码写入控制台,则需要在沙箱对象中包含console

需要考虑的另一件事:创建一个新的上下文是一项非常昂贵的操作 - 需要额外的时间和内存。认真考虑一下,如果你绝对需要这个。还要认真考虑这种情况发生的频率。

示例:

var vm = require('vm');
var sandbox = {
    console: console,
    msg: "this is a test",
};

vm.runInNewContext('console.log(msg);', sandbox, 'myfile.vm');

// this is a test

编辑:需要考虑的更多内容:您将需要创建一个新进程来运行它。即使它处于新的上下文中,它仍然处于调用它的同一个进程中。因此,恶意用户可以简单地设置一个永不结束的for循环,以便它永远不会退出。你需要弄清楚逻辑,知道什么时候发生这样的事情,这样你就可以杀死进程并创建一个新进程。

最后的想法:新的上下文在不受信任的代码中没有setTimeout or setInterval . You may or may not want to add these. However, if you create a setInterval`,并且不受信任的代码永远不会停止它然后它将永远继续。你需要找到一种方法来结束脚本,我可能还没有调查它。