【问题标题】:Get user's input and use it as a Function获取用户的输入并将其用作函数
【发布时间】:2021-08-17 21:58:51
【问题描述】:

我正在开发一个测试用例可视化工具,用户可以在其中运行他的代码并检查它是否正确。我正在使用 Node Js,并且正在从文本区域获取用户代码。假设这是我从用户那里得到的:

function add(x, y) {
    return x + y;
}

这就是我在后端所做的:

app.post("/main", function(req, res) {
    console.log("hello");
    var x = 1;
    var y = 2;
    req.body.code //missing
})

如何将此输入用作函数并运行它以获取值?

【问题讨论】:

  • 然后有一天,用户发送while(true);

标签: javascript node.js web


【解决方案1】:

不要使用eval() !!

从您的服务器上的用户运行任意代码可能是我听说过的最容易被黑客入侵的方法。如果你这样做,任何用户都可以对你的服务器做任何他们想做的事情。

有许多解析器(如esprima)可以在不实际运行代码的情况下解析/验证代码。选择其中之一,而不是打开服务器的前门。

【讨论】:

    【解决方案2】:

    我最终做的是我使用了vm2 sandbox

    vm2 是一个沙箱,可以使用列入白名单的 Node 的内置模块运行不受信任的代码。它运行良好,您可以限制对某些方法的访问。

    首先需要它:

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

    然后,指定超时时间和沙箱:

    const vm = new VM({
        console: 'inherit',
        timeout: 1000,
        sandbox: { global_variable },
        require: {
            external: true,
        },
    });
    

    global_variable 只是我用来导出输出的“var”。

    现在让我们在名为“func”的字符串中使用以下函数:

    function Main(x,y){
    return x+y};
    

    将其与:

    global_variable.exports=Main(5,5);
    

    现在通过以下方式运行代码:

    vm.run("func")
    

    要打印答案,只需执行以下操作:

    global_variable.exports;
    

    仅当您有需要运行的 javascript 代码时,此解决方案才有效。我仍在寻找在 node js 中运行多种语言的其他解决方案。 如果您有任何建议,请告诉我。

    【讨论】:

      【解决方案3】:

      最简单的方法是使用eval() 函数。 比如说,您的客户端将函数作为字符串传递给服务器(正文中的代码参数)。所以你可以这样做:

      提醒一下:这种方法非常不安全,使用eval不是一个好习惯,所以根据你的情况,你也许可以使用其他方法

      app.post("/main", function(req, res) {
        console.log("hello");
        var x = 1;
        var y = 2;
        eval(req.body.code); // This will return an Error if code is wrong
        add(x,y);
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多