替代eval()从服务器执行自动生成的JS代码

时间:2018-10-25 06:19:36

标签: javascript eval

var val = 3;

var code = "var a = 5; if (a >= val) { console.log(a + ' >= ' + val); a; } else { console.log(a + ' < 3 ' + val); val; }";


console.log(eval(code));


在这种情况下,需要eval()的替代方法。 服务器可以发送可以在特定块上运行的任何类型的JS代码。

3 个答案:

答案 0 :(得分:0)

请勿使用eval(code)new Function(code),因为两者基本上是同一件事,应由CSP阻止。

只需以content-type: text/javascript的形式从服务器返回您的内容,然后使用<script>块或import将其放入您的页面即可。

在服务器上,您会看到类似(伪代码,因为我不知道您使用的是哪种技术堆栈):

[Route("serverActionReturningCode")]
public string ActionReturningCode() 
{
    // return the content as JS
    Response.Headers.Add("content-type", "text/javascript");

    // build the response object as JS
    return "window.latestResult = {" + 
        "a: '" + a + "', " +
        "b: '" + b + "', " + 
        "generatedCode: function() { ... }" + 
    "};";
}

然后在您的页面中

<script src="serverActionReturningCode"></script>
<script>
     // Now the script above has run and set window.latestResult
     console.log('a', window.latestResult.a);
     console.log('b', window.latestResult.b);
     console.log('function output', window.latestResult.generatedCode());
</script>

这将使您可以在服务器上动态生成JS函数。

但是,如果您可以避免使用这些函数,而只需要传递值,那么使用JSON则要简单得多。

答案 1 :(得分:0)

似乎只能用评估或更改应用程序的整体设计。即使我们寻找其他选择,也将是名称和语法的更改。但是安全性问题将是相同的。服务器上的JS CodeGen工具将生成JS代码段并通过JSON在某些字段中将其发送的应用程序设计,必须在前端进行选择和执行。但是在这种设计中,我们可以保证 JS代码仅在用户设计时生成,而不在运行时生成。 感谢您的帮助。

答案 2 :(得分:-1)

您可以这样做。不建议使用Eval()

function looseJsonParse(obj){
    return Function('"use strict";return (' + obj + ')')();
}
console.log(looseJsonParse(
   "{a:(4-1), b:function(){}, c:new Date()}"
)) 

请参阅此MDN文章https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval 对其进行更多的挖掘。