eval 有什么作用,为什么它是邪恶的?

IT技术 javascript eval
2021-03-01 13:40:57
var myString = "x",
    myObject = {
        x: 10
    },
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);

评估是邪恶的

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

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

2个回答

eval() 接受给定的字符串,并像运行普通的 JavaScript 代码一样运行它。

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

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

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

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

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

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

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

创建自修改类 json 文件的功能似乎非常强大,这些文件除了数据之外还存储功能。例如,您可以创建一个通过检查您想要的功能是否是(parsedObject 中的“功能”)来“学习”的服务器,如果不是,它可以让客户端将该方法传授给该对象。这反过来又允许“活的图书馆”从您通过消息而不是编辑代码向他们教授事物中成长。我不认为 eval 是邪恶的,而是最强大的 javascript 构造。
2021-05-06 13:40:57
这种评估的演示是hastebin.com/eyacegaduq.coffee
2021-05-09 13:40:57
有趣的是,php 的 eval 比 javascript 的 eval 弱,因为 javascript 能够打印非本机函数的代码,因此您可以将对象字符串化回字符串,只要它是非本机的。而在 PHP 中,你不能这样做,所以自编 php 更难完成,而在 JavaScript 中,读取一个对象,将你想要的方法转换为字符串,更改它,将其放回字符串,这是非常简单的,并将更改写入对象,并将对象写入文件,从而有效地进行自我编写代码。
2021-05-16 13:40:57