安全地在node.js中运行(可能是恶意的)用户提交的脚本有哪些选项?即在阻止代码访问敏感数据和API的环境中?
vm.runInNewContext(userScript, {})
是一个诱人的起点......但似乎有known issues。
sandbox module看起来很有趣,但也使用runInNewContext()
,所以我对它有点怀疑。
答案 0 :(得分:31)
您应该始终在单独的进程中运行不受信任的代码,这正是沙盒模块所做的事情。一个简单的原因是vm.runInNewContext('while(true){}', {})
将冻结节点。
它首先生成一个单独的进程,稍后将在stdout上将结果序列化为JSON。无论孩子做了什么,父进程都会继续执行,并且可以触发超时。
然后将不受信任的代码封装在带有strict mode的闭包中(在常规JavaScript中,您可以使用arguments.callee.caller
来访问示波器之外的数据)。最后,传递了一个非常有限的global
对象,以防止访问节点的API。不受信任的代码只能进行基本计算,无法访问文件或套接字。
虽然您应该阅读沙盒的代码作为灵感,但我不建议按原样使用它:
为了提高安全性,您还可以考虑使用setuid-sandbox。这是Google Chrome用于阻止标签流程访问文件系统的代码。你必须制作一个原生模块,但这个example似乎很简单。
答案 1 :(得分:11)
a newer module on github called vm2解决了其中一些问题,特别是在Node.JS应用程序中。也许这会帮助其他人找到它,就像我刚刚做的那样。
答案 2 :(得分:0)
您可能想在Medium上查看此article。