[JavaScript]eval

eval()

eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。

参数

string 一个表示 JavaScript 表达式、语句或一系列语句的字符串。表达式可以包含变量与已存在对象的属性。

返回值

返回字符串中代码的返回值。如果返回值为空,则返回 undefined。

说明

  • 如果字符串表示的是表达式,eval() 会对表达式进行求值。

  • 如果参数表示一个或多个 JavaScript 语句,那么eval() 就会执行这些语句。

  • 总之一句话,食之无味,弃之可惜

    示例一:

    eval(new String("2 + 2")); // 返回了包含"2 + 2"的字符串对象
    eval("2 + 2");             // returns 4
    

    示例二:

    var s = "console.log('RoastDuck');";
    eval(s);
    
  • 通常,可以对语句进行加密,之后直接丢给eval执行。

    eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('    3 2(){        4 6 = "0";        1.5(6);    }2()',62,7,'RoastDuck|console|fn|function|let|log|name'.split('|'),0,{}))
    

    执行结果:

    RoastDuck
    
  • eval 中函数作为字符串被定义需要用“()”

    var fctStr1 = 'function a() {}'
    var fctStr2 = '(function a() {})'
    var fct1 = eval(fctStr1)  // 返回 undefined
    var fct2 = eval(fctStr2)  // 返回一个函数
    

永远不要使用 eval!

eval() 是一个危险的函数,它使用与调用者相同的权限执行代码。如果你用 eval() 运行的字符串代码被恶意方(不怀好意的人)修改,您最终可能会在您的网页/扩展程序的权限下,在用户计算机上运行恶意代码。更重要的是,第三方代码可以看到某一个 eval() 被调用时的作用域,这也有可能导致一些不同方式的攻击。

posted @ 2023-02-06 16:52  Rev_RoastDuck  阅读(25)  评论(0编辑  收藏  举报