关于如何从nodejs模块中删除全局上下文的任何想法?
我不是在寻找以下问题的解决方案,但如果您需要更多上下文,那么就去吧。
我正在开发一个项目,我的用户可以上传他们自己的nodejs模块,如果它适合预定义的框架,它将在我们定期的时间运行。显然这是一个重大的安全问题。一个好的90%解决方案只是删除全局背景。
答案 0 :(得分:4)
如评论中所述,您确实需要在单独的进程中运行用户提供的模块,因为无限循环将冻结任何节点进程。
您应该从VM模块开始:
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。