如何在node.js沙箱中安全地运行用户提交的脚本?

在node.js中运行(可能是恶意的)用户提交的脚本有什么select,安全吗? 也就是说,在阻止代码访问敏感数据和API的环境中?

vm.runInNewContext(userScript, {})是一个很有吸引力的起点,但似乎有一些已知的问题 。

沙盒模块看起来很有趣,但也使用runInNewContext() ,所以我有点怀疑它。

您应该始终在单独的进程中运行不受信任的代码,这正是沙箱模块所做的。 一个简单的原因是vm.runInNewContext('while(true){}', {})会冻结节点。

它开始产生一个单独的进程,稍后将其结果序列化到JSON的标准输出。 父进程继续执行,不pipe孩子做什么,都可以触发超时。

然后将不可信的代码封装在严格模式的闭包中(在常规JavaScript中,可以使用arguments.callee.caller来访问范围外的数据)。 最后,一个非常有限的global对象被传递,以防止访问节点的API。 不受信任的代码只能做基本的计算,并且不能访问文件或套接字。

虽然你应该阅读沙箱的代码作为一个灵感,我不会推荐使用它:

  • 代码已经变老,并且还没有被更新7个月。
  • 节点中的subprocess模块已经提供了你需要的大部分function,特别是child_process.fork() 。
  • child_process.fork提供的IPC通道可能有更好的性能。

为了增加安全性,你也可以考虑使用setuid-sandbox 。 这是Google Chrome用来防止标签进程访问文件系统的代码。 你将不得不做一个本地模块,但这个例子看起来很简单。

github上有一个更新的模块叫做vm2 ,它解决了这些问题,特别是在Node.JS应用程序中。 也许这会帮助其他人find它,就像我刚刚做的那样。