如何从nodejs模块中删除全局上下文?

时间:2012-12-20 22:58:40

标签: javascript node.js module global-variables node-modules

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

我不是在寻找以下问题的解决方案,但如果您需要更多上下文,那么就去吧。

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

1 个答案:

答案 0 :(得分:4)

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

您应该从VM模块开始:

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

以下是一个例子:

var fs = require('fs'),
    vm = require('vm');

function runCode(fileName) {
  var code = fs.readFileSync(fileName),
      sandbox = {
        console: console,
        setTimeout: setTimeout,
        clearTimeout: clearTimeout,
        require: require,
        module: module,
        exports: exports,
        process: process,
        Buffer: Buffer
      };

  vm.runInNewContext(code, sandbox, fileName);
}

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

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