【问题标题】:what does eval do and why its evil? [duplicate]eval 做了什么,为什么它是邪恶的? [复制]
【发布时间】:2013-08-18 15:39:33
【问题描述】:
var myString = "x",
    myObject = {
        x: 10
    },
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);

eval is evil

我一直在互联网上阅读有关 eval() 函数的信息,但除了“它评估表达式”之外,我无法真正了解它的实际作用。

我们应该只对数值使用 eval() 函数吗?

【问题讨论】:

  • 看右边的相关问题。

标签: javascript eval


【解决方案1】:

eval() 获取给定的字符串,并像运行纯 JavaScript 代码一样运行它。

它被认为是“邪恶的”,因为:

  • 它使事情过于复杂 - 大多数使用eval() 的情况下,会有一个不需要它的更简单的解决方案。问题中的这个例子就是一个完美的例子:绝对不需要eval() 这样的表达式。 JS 具有非常好的语法,可以将对象属性名称作为字符串引用(myObject["x"]myObject.x 相同)。

  • 调试起来要困难得多 - 在调试器中使用它更加困难,即使您设法弄清楚发生了什么,您还有额外的工作要做,因为您必须同时调试 eval'd 代码和生成原始字符串到 eval 的代码。

  • 它会减慢速度 - 脚本编译器无法预编译 eval() 中的代码,因为它在到达那里之前不知道代码将包含什么。因此,您会失去现代 Javascript 引擎的一些性能优势。

  • 这是黑客的梦想 - eval() 将字符串作为代码运行。黑客喜欢这个,因为将字符串注入程序比注入代码要容易得多。但是eval() 意味着您可以注入一个字符串,并让它作为代码运行。所以eval() 让你的代码更容易被破解。 (对于基于浏览器的 Javascript 而言,这比其他语言的问题要小,因为 JS 代码无论如何都可以在浏览器中访问,因此您的安全模型不应基于您的代码是不可变的,但是尽管如此,注入黑客仍然可能是一个问题,尤其是跨站点攻击)。

【讨论】:

    【解决方案2】:

    在这种情况下,只需使用myObject[myString]

    eval 被严重滥用。我发现它的唯一有效用途是在旧浏览器中解析 JSON。

    【讨论】:

    • 它似乎非常强大,可以创建自我修改的类 json 文件,这些文件除了数据之外还存储功能。例如,您可以通过检查您想要的功能是否是(parsedObject 中的“功能”)来创建一个“学习”的服务器,如果不是,它可以让客户端将该方法传授给该对象。这反过来又允许“活图书馆”从你通过消息而不是编辑代码向他们传授东西而发展起来。我不认为 eval 是邪恶的,而是最强大的 javascript 构造。
    • 有趣的是,php 的 eval 比 javascript 的 eval 弱,因为 javascript 能够打印非原生函数的代码,所以只要是非原生的,你就可以将对象字符串化回字符串。而在 PHP 中,您无法做到这一点,因此自写 php 更难实现,而在 JavaScript 中,读取对象、转换您想要字符串的方法、更改它、将其放回字符串非常简单,并将更改写入对象,并将对象写入文件,从而有效地自行编写代码。
    • 这种评估的演示是hastebin.com/eyacegaduq.coffee
    猜你喜欢
    • 2011-02-04
    • 2010-10-31
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2010-11-22
    • 2010-10-13
    相关资源
    最近更新 更多