我似乎无法弄清楚如何设置 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/