is eval evil?

作者: 柳正来 | 来源:发表于2018-02-20 07:11 被阅读10次

最近项目中, 一个为了确保安全性而做的任务是移除代码中的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?

相关文章

  • is eval evil?

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

  • 关于eval

    很多规范说是eval is evil,自己也就人云亦云,没有深究过,但是到底eval是不是evil,看了P84页,...

  • YUI Compressor压缩失效的场景-eval和with

    一、官方文档的说明 in the face of evil features such as eval or wi...

  • eval到底哪里不好?

    eval是 js 中一个强大的方法,它的作用是编译运行传入字符串代码。都说eval == evil等于true,这...

  • The evil wins the evil

    The evil wins the evil By: Sara 10 years old A was p...

  • 《菜根谈》112

    直躬不畏人忌,无恶不惧人毁 (Be not to fear fear, evil evil evil fear w...

  • Evil

    1,强化Emacs的编辑能力(你当然可以自己写函数,有现成的不更好么),同时你也不会感觉到Vim的影子!关键的关键...

  • Evil

    最大的悲劇不是壞人的囂張,而是好人的過度沉默?‍♂️

  • If Is Evil

    nginx 是分阶段执行的,并不像 C 这种编程语言一样顺序执行。指令执行的顺序和书写的顺序没有太大关系(跟具体模...

  • If Is Evil

    介绍 当在location区块中使用 if 指令的时候会有一些问题, 在某些情况下它并不按照你的预期运行而是做一些...

网友评论

    本文标题:is eval evil?

    本文链接:https://www.haomeiwen.com/subject/tynwtftx.html