为什么使用JavaScript eval函数是一个坏主意?

eval函数是动态生成代码的一种强大且简单的方法,那么注意事项是什么?


  • 不当使用eval会打开注入攻击代码

  • 调试可能更具挑战性(没有行号等)

  • eval'd代码执行较慢(没有机会编译/缓存eval'd代码)

  • 编辑:正如@Jeff Walden在评论中指出的那样,#3现在比2008年更不真实。但是,尽管可能会发生一些编译脚本的缓存,但这仅限于未经修改而重复评估的脚本。 更可能的情况是,您正在评估每次都经历轻微修改的脚本,因此无法缓存。 我们只是说,某些评估代码执行起来比较慢。


    eval并不总是邪恶的。 有些时候它完全合适。

    然而,eval目前和历史上被不知道自己在做什么的人大量过度使用。 不幸的是,这包括编写JavaScript教程的人员,在某些情况下,这确实会产生安全后果 - 或者更常见的是简单的错误。 因此,我们可以做的越多,就越容易抛出问号。 任何时候你使用eval都需要理智,检查你在做什么,因为你有可能将它做成更好,更安全,更清洁的方式。

    为了给出一个非常典型的例子,设置一个存储在变量“potato”中的id的元素的颜色:

    eval('document.' + potato + '.style.color = "red"');
    

    如果上述代码的作者对JavaScript对象的工作原理有了线索,他们会意识到可以使用方括号代替文字点名,从而避免了对eval的需要:

    document[potato].style.color = 'red';
    

    ...这是更容易阅读以及更少的潜在错误。

    (但是,那些/真的/知道他们在做什么的人会说:

    document.getElementById(potato).style.color = 'red';
    

    这比直接从文档对象中访问DOM元素的狡猾的旧技巧更可靠。)


    我相信这是因为它可以从字符串中执行任何JavaScript函数。 使用它可以让人们更容易地将恶意代码注入到应用程序中。

    链接地址: http://www.djcxy.com/p/75085.html

    上一篇: Why is using the JavaScript eval function a bad idea?

    下一篇: How to convert string into boolean?