在沙箱中的服务器上运行不受信任的JavaScript代码

时间:2017-08-19 03:28:39

标签: javascript node.js express virtual-machine

我似乎无法弄清楚如何设置一个节点沙箱,它可以安全地运行不受信任的代码,并允许用户通过api调用 与该程序进行交互 (sys进出)。我试图在浏览器中设置一个控制台,以便用户从服务器运行自己的代码。

是否有支持此功能的节点包,或者我是否需要编写自己的节点VM?感谢。

编辑:我希望用户能够编写readline()并让程序在断点处等待传输数据。类似console.log()的输出应该重定向到输入api调用的响应。

1 个答案:

答案 0 :(得分:1)

您可以使用vm2模块,以安全的方式运行用户输入附带的几乎所有代码。

您甚至可以定义用户提供的代码是否可以通过相对路径访问需要本机节点模块或其他模块,甚至可以定义来自用户输入的代码是否可以进行外部呼叫。

你可以包围并执行这个"不信任" try/catch中的代码,用于观察灾难性故障,甚至设置超时,以便此次运行不会淹没。

快速示例

const {VM} = require('vm2');
const vm = new VM();

vm.run(`process.exit()`); // TypeError: process.exit is not a function

使用"请求"模块" bultin"用于访问外部资源

const {NodeVM} = require('vm2');
const vm = new NodeVM({
    require: {
        external: true // allow all modules or use Array for one e.g: ['request']
    }
});    

vm.run(`
    var request = require('request');
    request('http://www.google.com', function (error, response, body) {
        console.error(error);
        if (!error && response.statusCode == 200) {
            console.log(body) // Show the HTML for the Google homepage.
        }
    })
`, 'vm.js');

默认情况下,该条目被编译为javascript,但您可以使用自定义编译器传递函数。