什么时候应该使用eval(将字符串作为代码在运行时执行)?

问题描述:

我经常听到这个说法(在javascript中,但许多语言具有类似eval的特性),使用eval是“不好的”。这些论点是,你认为使用eval的大部分事情可以通过其他方式完成,在大多数情况下,eval的速度非常慢,并且它可以允许用户输入要执行的代码(如果未采取适当的预防措施)。我们知道大多数功能不仅仅是固有的“坏”,而是让我们关注eval,什么时候应该使用eval(将字符串作为代码在运行时执行)?

eval的一些有效用途是什么? (除了为开发人员调试应用程序提供了一个很好的功能)

eval()有好有坏的一点。任何语言支持eval的最糟糕的方面是,它会打开安全漏洞的大门。如果开发人员能够弄清楚如何获得任何自定义代码,那么他就可以写入应用程序的eval语句中,然后他可能会执行各种恶意的事情,如窃取私有数据或禁用应用程序提供的服务。性能是您已经表达的另一个关注点。

Eval真的能够在您的代码可能需要动态生成其他代码以轻松执行复杂任务的区域中发光。我现在想不出一个例子,但是任何你需要这样做的情况都可能不会是微不足道的。我建议只在绝对必要的时候这样做才能尽量减少我在前一段中提到的问题的风险。如果可能,永远不要相信用户输入足够安全以使用eval。

A read-eval-print loop通常会使用eval实现。

+0

您应该始终引用您链接的页面中最相关的部分,让读者知道您在说什么。请参阅http://stackoverflow.com/help/how-to-answer。 – 2016-10-25 05:39:35

eval的缺陷与SQL注入一样。如果你在你的代码中动态地构造字符串并且在这个罚款上调用eval。但是,如果你的代码是盲目地将用户输入连接到一个字符串中进行评估,那么你就是在要求它。有很多情况下,eval可能是有用的,但人们往往会避免它,因为还有其他方法可以解决eval的需求。

从可信来源解码json。像在图形计算器中一样评估用户输入的表达式。想不到太多的东西,虽然它在90年代后期被不想学习访问页面元素的正确方法的人所滥用。

+0

您可以在不使用eval的情况下解码JSON。它只是发生,json2.js使用eval。 – 2009-08-27 03:04:11

我曾经写过一个perl CGI脚本,它的输出是perl代码,它被另一台机器上的另一个脚本和eval()'d所检索。这只是安全的,因为我是在控制两端,但它确实解决了一个问题,否则这就要求我在XML广为人知之前的一个时代发明某种序列化格式。

它使得metaprogramming一窍不易。很好,如果你想以某种方式分析一个程序(例如,为了调试或分析目的)。

eval的唯一合法用途是执行您无法控制的代码(除非您制作javascript sandbox,否则您不应该这样做)。