从nodejs模块中删除全局上下文的任何想法?
我不是在寻找解决以下问题的解决方案,但是如果您需要更多上下文,则可以。
我正在研究一个项目,我的用户可以上传自己的Nodejs模块,并且,如果它符合预定义的框架,它将在我们的定期时间内在我们的日期中运行。显然,这是一个主要的安全问题。一个好的90%的解决方案将仅消除全球环境。
如注释中所述,您确实需要在单独的过程中运行用户供给模块,因为无限循环会冻结任何节点过程。
您应该从VM模块开始:
- 读取文件内容(使用fs.ReadFile,而不是
require
)。 - 定义一个新的全局对象。您可以选择暴露任何想要的东西(并隐藏其余的)。
- 运行用户代码。
这是一个示例:
var fs = require('fs'), vm = require('vm');函数runcode(filename){ var code = fs.ReadFilesync(文件名), 沙盒= { 控制台:控制台, settimeout:settimeout, cleartimeout:cleartimeout, 要求:要求, 模块:模块, 出口:出口, 过程:过程, 缓冲区:缓冲区 }; vm.runinnewcontext(代码,沙盒,文件名);}
用户提供的代码将能够访问我在沙箱中传递的所有内容,就好像它在全局范围中一样。就我而言,我选择了几乎揭露来自真实node.js全局范围的所有内容。您可以选择不暴露的东西。
另外,如果要解决方案,则应检查Child_process.spawn。