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

时间:2012-06-14 07:35:55

标签: node.js

方法很少 (1)eval() (2)使用节点在新上下文中评估代码的能力 (3)使用https://github.com/gf3/sandbox#readme

之类的东西

但我不确定哪一个更安全并且表现良好。我几乎无法解释我的用例。用户将提交脚本,我将一个对象传递给该脚本,该脚本已经在其中定义了处理逻辑,最后它将返回一个我希望进入我的应用程序以供进一步使用的对象。

我在互联网上搜索过但无法找到关于哪条路可行的好建议?

1 个答案:

答案 0 :(得分:0)

我在我的项目中有类似的要求,在我的研究过程中遇到了你的问题,让我分享我的发现:

使用eval + vm.runInNewContexthttp://nodejs.org/docs/latest/api/vm.html#vm_sandboxes):

这可能是不安全的,并且从邮件列表和问题跟踪器中的语句来看,这也不是推荐用途。您已链接的沙箱模块是建议的方法。

另请参阅:https://github.com/joyent/node/issues/1469

使用子进程(http://nodejs.org/api/child_process.html):

如果您不计划过多的并发性,这可能是一个很好的解决方案。新的孩子是一个新的V8实例,需要大约30ms才能启动并使用大约10MB的内存。你可以在完成后杀死孩子并释放记忆。

沙箱模块(https://github.com/gf3/sandbox):

该模块是为此目的而构建的,它使用子进程。它将以最简单的方式解决您的问题。您也可以将其用作如何创建自己的基于子进程的解决方案的示例。