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

X88*_*B88 6 javascript virtual-machine node.js express

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

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

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

Lau*_*aes 3

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

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

您可以在 a 中封装并执行此“不受信任”的代码,try/catch以观察灾难性故障,甚至设置超时,以便此运行不会崩溃。

简单的例子

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

vm.run(`process.exit()`); // TypeError: process.exit is not a function
Run Code Online (Sandbox Code Playgroud)

使用“请求”模块“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');
Run Code Online (Sandbox Code Playgroud)

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