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

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

我不是在寻找一个解决scheme来解决下面的问题,但是如果你需要更多的上下文,那就去吧。

我正在开发一个项目,在这个项目中,我的用户可以上传自己的nodejs模块,如果它符合预定义的框架,它将在整个周期中定期运行。 显然这是一个重大的安全问题。 一个好的90%的解决scheme就是简单地去除全局上下文。

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

您应该从VM模块开始:

  • 阅读文件内容(使用fs.readFile , require )。
  • 定义一个新的全局对象。 你可以select暴露任何你想要的(并隐藏其余的)。
  • 运行用户代码。

这是一个例子:

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

函数runCode(fileName){
   var code = fs.readFileSync(fileName),
       sandbox = {
        控制台:控制台,
         setTimeout:setTimeout,
         clearTimeout:clearTimeout,
        要求:要求,
        模块:模块,
        出口:出口,
        过程:过程,
        缓冲液:缓冲液
       };

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

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

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