is eval evil?

最近项目中, 一个为了确保安全性而做的任务是移除代码中的eval. 我对eval的不好略有耳闻, 但是它到底有多不好? 今天了解下.

Douglas Crockford说过:

The eval function (and its relatives, Function, setTimeout, and setInterval) provide access to the JavaScript compiler. This is sometimes necessary, but in most cases it indicates the presence of extremely bad coding. The eval function is the most misused feature of JavaScript.

这句话被很多人用来佐证eval的不好. eval被认为为攻击者进行Cross-Site Scripting (XSS) 攻击创造了便利. 但其实使用得当, eval并没有什么问题.

错误应用

比方说下面这段代码, 利用eval去判断一个表单元素是否被选中.

function isChecked(optionNumber) {
    return eval("forms[0].option" + optionNumber + ".checked");
}

var result = isChecked(1);

这段代码很容易用没有eval的方式实现.

function isChecked(optionNumber) {
    return forms[0]["option" + optionNumber].checked;
}

var result = isChecked(1);

这类似错误的eval应用可以简单地使用[]来避免.

调试

eval中的代码为调试带来了难度. 现在Chrome Dev Tool可以debugeval中的代码, 但是仍然很麻烦. 所以, 从这点出发, 为了开发效率, 也尽量不要用eval.

效率

旧的浏览器中, 如果你使用eval, 浏览器就要进行两次解析. 第一次解析JS代码本身, 第二次解析eval中的代码. 在不带JS编译引擎的浏览器中, 效率可能相差十倍.

即使对于带JS编译引擎的浏览器, eval还是有问题. 大多数引擎运行代码时会在两种模式中选择: 一个是fast path, 一个是slow path. 如果代码稳定, 比较容易预测, 那么引擎会使用fast path运行代码, 效率高很多. 如果代码很难预测, 那只能用slow path运行了. 由于带eval的代码本身很难预测, 所以会走slow path, 因此也会造成效率低下.

安全性

eval最让人头疼的地方就是安全性了. 如果你将用户的输入作为eval的参数, 那么就有XSS的风险. 但是你只要确保不做出这种事, 使用eval也是没什么问题的.

另外一点是, 有些人说, 如果你使用eval去运行浏览器返回的代码, 那么就有可能受到中间人攻击 (man-in-the-middle attack). 但是事实上, 如果一个人真的做到了中间人攻击, 除了用eval, 有更多简单的方法让他运行恶意代码, 比如:

  1. 在代码中插入<script src="">并引用恶意代码.
  2. 在JSON-P或者Ajax请求中插入恶意代码.

另外, 中间人攻击可以获取用户的cookie或者其他信息, 同时不篡改任何信息, 不被察觉. 这本身也是安全隐患, 与eval无关.

总之, 如果你无法相信浏览器返回的代码, 那这本身产生的问题就远比eval的问题大得多.

总结

eval在调试和效率有不好的影响, 有一定的安全性隐患, 但是只要注意就可以避免. 总体来说, eval尽量不要用.

参考

  1. eval() isn’t evil, just misunderstood
  2. Why is using the JavaScript eval function a bad idea?
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容