关于如何从 nodejs 模块中删除全局上下文的任何想法?
我不是在寻找以下问题的解决方案,但是如果您需要更多上下文,请前往。
我正在开发一个项目,我的用户可以上传他们自己的 nodejs 模块,如果它符合预定义的框架,它将在一天中定期运行。显然,这是一个主要的安全问题。一个好的 90% 解决方案只是删除全局上下文。
关于如何从 nodejs 模块中删除全局上下文的任何想法?
我不是在寻找以下问题的解决方案,但是如果您需要更多上下文,请前往。
我正在开发一个项目,我的用户可以上传他们自己的 nodejs 模块,如果它符合预定义的框架,它将在一天中定期运行。显然,这是一个主要的安全问题。一个好的 90% 解决方案只是删除全局上下文。
如评论中所述,您确实需要在单独的进程中运行用户提供的模块,因为无限循环将冻结任何节点进程。
您应该从VM模块开始:
require
)。这是一个例子:
var fs = 要求('fs'), vm = 需要('vm'); 函数运行代码(文件名){ var 代码 = fs.readFileSync(fileName), 沙箱 = { 控制台:控制台, 设置超时:设置超时, 清除超时:清除超时, 要求:要求, 模块:模块, 出口:出口, 过程:过程, 缓冲区:缓冲区 }; vm.runInNewContext(代码,沙箱,文件名); }
用户提供的代码将能够访问我在沙箱中传递的所有内容,就好像它在全局范围内一样。在我的例子中,我选择从真正的 node.js 全局范围中公开几乎所有内容。您可以选择不公开的内容。
此外,如果您希望您的解决方案安全,您应该检查child_process.spawn 。