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

标签 javascript node.js express virtual-machine

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

是否有支持此功能的 Node 包,或者我是否需要编写自己的 Node 虚拟机?谢谢。

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

最佳答案

您可以使用 vm2模块并以安全的方式运行几乎所有随用户输入而来的代码。

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

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

关于javascript - 在沙箱中的服务器上运行不受信任的 javascript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45767337/

相关文章:

javascript - 使用 Karma (Jasmine) 测试 AngularJS 工厂

node.js - 按一对多关系中的子项数量对查询进行排序

javascript - 我正在尝试调用一个包含 promise 的函数。 JavaScript

ios - Express body parser 整个请求体是没有值的键

javascript - expressjs中.get()需要回调函数错误,即使语法正确

node.js - Socket.io 替代方案

javascript - 获取 JavaScript 中引用更改的通知

javascript - 使用正则表达式计算字符串中引号的数量

node.js - 平均堆栈中的 session 处理

javascript - 为什么 SpeechSynthesis.speak() 在 Firefox 中不能被多次调用?