在node.js中安全地运行(可能是恶意的)用户提交的脚本有哪些选项?是否在防止代码访问敏感数据和API的环境中?
vm.runInNewContext(userScript, {})是一个诱人的起点…但是似乎那里存在已知问题。
vm.runInNewContext(userScript, {})
在沙箱模块看起来很有趣,但使用runInNewContext()也使我的有点持怀疑态度。
runInNewContext()
您应该始终在单独的过程中运行不受信任的代码,这正是沙盒模块所做的。一个简单的原因是vm.runInNewContext('while(true){}', {})它将冻结节点。
vm.runInNewContext('while(true){}', {})
它从产生一个单独的进程开始,随后将在其stdout上将序列化的结果发送到JSON。无论孩子做什么,父进程都会继续执行,并且可能触发超时。
然后,将不受信任的代码包装在严格模式下的闭包中(在常规JavaScript中,您可以arguments.callee.caller用来访问范围之外的数据)。最后,global传递一个非常有限的对象以防止访问节点的API。不受信任的代码只能进行基本计算,不能访问文件或套接字。
arguments.callee.caller
global
虽然您应该阅读沙盒的代码作为灵感,但我不建议按原样使用它:
为了提高安全性,您还可以考虑使用setuid-sandbox。这是Google Chrome浏览器用来防止制表符进程访问文件系统的代码。您必须制作一个本机模块,但是此示例似乎很简单。