我何时应该使用eval(在运行时使用字符串并将其作为代码执行)?

时间:2009-08-26 22:20:51

标签: language-agnostic eval

我经常听到这个论点(在javascript中,但许多语言都有类似eval的功能),使用eval是“糟糕的”。您认为使用eval的大多数事情可以通过其他方式完成,即大多数情况下eval非常慢,并且可以允许用户输入要执行的代码(如果没有采取适当的预防措施) )。我们知道大多数功能本身并不仅仅是“糟糕”,而是让人们关注eval,

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

7 个答案:

答案 0 :(得分:7)

通常使用eval实现read-eval-print loop

答案 1 :(得分:6)

eval()有好有坏。在支持它的任何语言中,eval最糟糕的方面是它为安全漏洞敞开了大门。如果开发人员可以弄清楚如何获取任何自定义代码,并将其写入应用程序中的eval语句,那么他可能会执行各种各样的恶意操作,例如窃取私有数据或禁用应用程序提供的服务。表现是你已经表达的另一个问题。

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

这让metaprogramming变得简单。如果您想以某种方式分析程序(即用于调试或分析目的),那就太棒了。

答案 4 :(得分:0)

从值得信赖的来源解码json。评估用户输入的表达式,如图形计算器。不能想太多其他的东西,虽然它在90年代后期被那些不想学习正确的方法来访问页面元素的人滥用了。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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