[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()
被调用时的作用域,这也有可能导致一些不同方式的攻击。