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

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

有没有支持这个节点的软件包,还是我需要编写自己的节点虚拟机? 谢谢。

编辑:我希望用户能够写入readline()并让程序在断点处等待传入的数据。同样, console.log()的输出应该redirect到inputAPI调用的响应。

您可以使用vm2模块并以安全的方式运行几乎所有随用户input提供的代码。

您甚至可以定义用户提供的代码是否可以通过相对path访问本地节点模块或其他模块,甚至可以定义来自用户input的代码是否可以进行外部调用。

你可以在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 eg: ['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但是您可以使用自定义编译器传递一个函数。