安全沙盒并执行用户提交的JavaScript?

我希望能够让用户提交任意的JavaScript代码,然后将其发送到Node.JS服务器,并在将输出发送回多个客户端(如JSON)之前安全地执行。 eval函数让人想起,但我知道这有多个安全问题(用户提交的代码将能够访问节点的文件API等)。 我曾经看到过一些像Microsoft Web Sandbox和Google Caja这样的项目,它们允许执行清理标记和脚本(用于在网站上embedded第三方广告),但似乎这些是客户端工具,我不确定他们是否可以在Node中安全使用。

有没有一个标准的方法来沙盒和在Node中执行不可信的JavaScript,获得输出。 尝试和做这个服务器端是错误的吗?

编辑:用户能够充分利用JavaScript的全部function并不重要,事实上,能够挑选并select将提供给用户代码的API将是优选的。

编辑:我打算继续前进,并与我发现的更新。 这个Sandcastle模块( bcoe/sandcastle sandcastle)似乎旨在做我脑海中所想的事情。 不知道它是多么的安全,但是因为我不是那么重要,我想我会试试。 如果我能够成功地做到这一点,我会添加自己的答案。

这个答案已经过时,因为gf3没有提供防止沙盒破坏的保护

http://gf3.github.io/sandbox/ – 它使用require('child_process')而不是require('vm')

你可以使用vm.runInContext('js code',context)在nodejs中使用沙箱支持,在api文档中使用样例:

https://nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_options

 const util = require('util'); const vm = require('vm'); const sandbox = { globalVar: 1 }; vm.createContext(sandbox); for (var i = 0; i < 10; ++i) { vm.runInContext('globalVar *= 2;', sandbox); } console.log(util.inspect(sandbox)); // { globalVar: 1024 } 

警告:正如“s4y”所指出的,它似乎是有缺陷的。 请看看评论。

在Node.js下,你可以创build一个沙盒subprocess,但你也需要在代码后加上"use strict"; ,否则可以用arguments.callee.caller打破沙箱。

不知道为什么你需要将它发送到服务器,因为代码也可能在沙盒networking工作人员执行。

还要看看我的Jailed库,它简化了Node.js和Web浏览器的所有内容,并且还提供了将一组函数导出到沙盒中的机会。