如何从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 。