什么情况下需要使用eval(),因为没有其他替代方案?

8
我知道在 JavaScript 中应该避免使用 eval,因为存在速度和安全性问题。但是在 PHP 中很少提到安全性问题,更常见的是由于随意使用 eval 导致程序运行速度变慢。
在什么情况下应该使用 eval,因为没有其他办法呢?
需要澄清的是:
我们并不讨论用户提供的数据。所以这个问题集中在完全受控制的服务器端有效使用 eval 上。
5个回答

10
在PHP中使用eval来评估代码所带来的安全问题与JavaScript相同:如果你要评估某段代码,你必须确定它来自何处以及包含了什么内容。甚至安全影响可能更大,因为PHP可以访问你的数据库(以及其他东西),这意味着它可以用来窃取/破坏几乎是应用程序所依赖的所有信息!
在JavaScript中,人们说“eval is evil”;在PHP中这一点也非常正确。
现在,关于特定的情况,在这些情况下你不能避免使用eval...好吧,在我作为每天工作中开发PHP的4年时间里,我不记得曾经在自己的代码中使用过eval^^
不过,需要使用eval的一个例子是当你将一些代码存储在数据库中时,而不是缓存到文件中(可以被包含)--这种情况在一些CMS中会发生,例如允许在管理部分输入一些PHP代码的CMS。

完全同意。与js eval相比,我会更加小心PHP eval,并且我想不起有一个需要它的情况。 - Roland Bouman
4
+1 我会说在 PHP 中它比 JavaScript 更加邪恶,因为它可以访问磁盘、数据库和任意网络。 - Justin Johnson

2

Eval和create_function可能允许任意代码注入。PHP中有很多东西可以用来危及应用程序的安全。

我们告诉孩子不要玩刀子和火柴 - 但是当正确使用时,这些工具是有用(如果不是必不可少的)。PHP的很多功能也是如此。使用这些功能本质上没有问题,只要你完全理解自己在做什么

但是,在StackOverflow上进行编程语言的抽象讨论并不是它的主要目的。

C.


0
我知道为了速度和安全性的原因,JavaScript 应该避免使用 eval。但在 PHP 的情况下,很少有人提到安全性问题。更经常出现的是,由于随意使用 eval,程序运行得比应有的速度要慢。

在 PHP 中,eval也是邪恶的。

那么,在什么具体情况下,您需要使用 eval(),因为没有其他方法绕过它呢?首先,尽可能地避免使用它,但如果确实需要用它来执行一些代码,那么你就必须用它。但正如上面所说,它是邪恶的,你自己承担风险。

底线:

绝不能以任何方式让用户输入与 eval 一起运行。 (除非您知道自己在做什么/冒着什么风险)


OP没有说这是使用用户提供的数据,而该文章基于(非常简短的)论点。他问是否有任何有效的情况可以使用它。显然,在用户提供的数据上使用eval是无效的,但这并没有真正回答问题。 - T.J. Crowder
@Crowder:他说:“出于速度和安全原因,JavaScript中应该避免使用eval。但在PHP的情况下,很少提到安全性。”假设在PHP中没有将其视为邪恶 :) 我也讨论了情况/用法部分。谢谢。 - Sarfraz

0

我完全同意之前的答案,即eval是有害的,我从不在我的代码中使用它。

但在一个情况下,我无法避免使用eval。我对php没有太多经验,所以如果有人能建议我如何在没有eval的情况下重写代码,我会很高兴。在那种情况下,我将类名存储在一个变量中,并且必须调用该类的静态方法,类名来自可信源,因此我必须编写类似于以下内容的东西:

eval("\$result = $className::methodName()");

因为你不能只写 $className::methodName() ;



根据你所使用的PHP版本,可以使用以下两种方式之一来调用函数:call_user_func(array($className, 'methodName'))call_user_func("$className::methodName") - Matthew
call_user_func(array($className, $methodName)); 应该可以工作。 - Jimmeh
安全方面存在相同的问题,但性能更好...不知道为什么我没有想到使用它) - kipelovets

0
如果你想在PHP 5.3之前使用匿名函数,你需要使用create_function,它会包装一个eval()调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接