【问题标题】:Running untrusted javascript code on server in sandbox在沙箱中的服务器上运行不受信任的 javascript 代码
【发布时间】:2017-08-19 03:28:38
【问题描述】:

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

是否有任何节点包支持这一点,还是我需要编写自己的节点 VM?谢谢。

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

【问题讨论】:

  • 也许是:Nodejs VM module?虽然如果您想要完全安全的沙箱,那么您可能需要在实际隔离的 VM 中运行一个新的 nodejs 进程。还有How to run user-submitted scripts securely in a node.js sandbox?
  • 我看过这些,但如果用户写readline(),它们似乎无法接受输入。 @jfriend00 检查编辑
  • 我不明白你在做什么。你期望标准输入来自哪里?您期待本地控制台吗?你期望标准输出去哪里?您的问题提到“通过 API 调用与程序交互”,我认为这意味着您正在启动服务器,并且其他地方的其他一些进程将与该服务器进行通信。
  • 是的,我有一个服务器正在运行,上面有用户的代码。当用户在客户端发出 api 请求来运行程序时,我想要一个 vm 来运行它。如果有 readline,程序应该暂停并等待,对客户端的响应将在断点之前产生任何 sys out 数据,并且应该告诉客户端输入是预期的。当用户输入输入时,程序继续进行,直到下一次输入或程序结束。在任何一种情况下,api 响应都会使 sys 退出。
  • 这能回答你的问题吗? How to run untrusted code serverside?

标签: javascript node.js express virtual-machine


【解决方案1】:

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

您甚至可以定义用户提供的代码是否可以通过相对路径访问所需的本机 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,但您可以使用自定义编译器传递函数。

【讨论】:

    猜你喜欢
    • 2015-05-16
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多