我希望能够让用户提交任意的JavaScript代码,然后将这些代码发送到Node.JS服务器,并在将输出发送回多个客户机(作为JSON)之前安全地执行。我想到了eval
函数,但我知道这涉及多个安全问题(用户提交的代码可以访问Node的File,等等)。我见过一些项目,如微软网络沙箱( Microsoft Web Sandbox )和Google Caja,它们允许执行经过净化的标记和脚本(用于在网站上嵌入第三方广告),但这些似乎是客户端工具,我不确定它们是否可以安全地在Node中使用。
是否有一种标准的方法在Node中进行沙箱和执行不受信任的JavaScript,以获得输出。尝试做这个服务器端是错误的吗?
编辑:--用户能够充分利用JavaScript的全部功能并不重要,实际上最好能够选择哪些API将提供给用户代码。
编辑:,我将继续更新我发现的内容。这个沙堡模块(bcoe/沙堡)似乎旨在做我想做的事情。不知道它有多安全,但由于我这并不是为了任何太重要的事情,我想如果我尝试一下的话。如果我能成功地做到这一点,我将添加我自己的答案。
发布于 2013-07-07 16:25:48
这个答案已经过时了,因为gf3没有提供防止沙箱破坏的保护。
http://gf3.github.io/sandbox/ --它使用require('child_process')
而不是require('vm')
。
发布于 2015-01-13 19:06:26
您可以在vm.runInContext('js代码,上下文)中使用nodejs中的沙箱支持,api文档中的示例:
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“所指出的,它似乎完美无缺。请看评论。
发布于 2018-01-01 12:26:35
另一种选择是使用http://github.com/patriksimek/vm2
$ npm install vm2
然后:
const {VM} = require('vm2');
const vm = new VM();
vm.run(`1 + 1`); // => 2
正如在其他答复的评论中提到的。
我不知道它有多安全,但它至少声称它安全地运行不受信任的代码(在它的自述文件中)。到目前为止,我找不到任何明显的安全问题,就像其他答案中提出的解决方案一样。
https://stackoverflow.com/questions/17513212
复制相似问题