Cor*_*oss 42 javascript eval sandbox sanitize node.js
我希望能够让用户提交任意JavaScript代码,然后将其发送到Node.JS服务器并安全执行,然后将输出发送回多个客户端(作为JSON).eval我想到了这个功能,但我知道这有多个安全问题(用户提交的代码可以访问Node的File API等).我见过一些项目,如Microsoft Web Sandbox和Google Caja,它们允许执行清理标记和脚本(用于在网站上嵌入第三方广告),但似乎这些是客户端工具,我不确定它们是否可以在Node中安全使用.
有没有一种标准的方法来沙盒并在Node中执行不受信任的JavaScript,从而获得输出.尝试做这个服务器端是错误的吗?
编辑:用户能够利用JavaScript的全部功能并不重要,事实上,最好能够选择将哪些API提供给用户代码.
编辑:我将继续使用我发现的内容进行更新.这个Sandcastle模块(bcoe/sandcastle)似乎旨在实现我的想法.不确定它有多安全,但由于我不是太重要,我想如果尝试的话.如果我能成功地做到这一点,我会添加自己的答案.
ton*_*ton 10
您可以在nodejs中使用vm.runInContext('js code',context)中的沙箱支持,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 }
Run Code Online (Sandbox Code Playgroud)
警告:正如"s4y"所指出的那样,它似乎是一种瑕疵.请看评论.
一种替代方法是使用http://github.com/patriksimek/vm2:
$ npm install vm2
Run Code Online (Sandbox Code Playgroud)
然后:
const {VM} = require('vm2');
const vm = new VM();
vm.run(`1 + 1`); // => 2
Run Code Online (Sandbox Code Playgroud)
如其他答案的评论中所述。
我不知道它有多安全,但它至少声称它安全地运行不受信任的代码(在它的自述文件中)。就此处其他答案中建议的解决方案而言,我找不到任何明显的安全问题。
此答案已过时,因为 gf3 不提供防止沙箱破坏的保护
http://gf3.github.io/sandbox/ -它使用require('child_process')的不是require('vm')。
在 Node.js 下,你可以创建一个沙盒子进程,但你也需要用 附加代码"use strict";,否则有可能用 破坏沙盒arguments.callee.caller。
不确定为什么需要将其发送到服务器,因为代码也可能在沙盒网络工作者中执行。
还可以看看我的Jailed库,它简化了刚才提到的 Node.js 和 web 浏览器的所有内容,另外还提供了将一组函数导出到沙箱中的机会。
| 归档时间: |
|
| 查看次数: |
13905 次 |
| 最近记录: |