什么情况需要使用eval(),因为没有其他选择?

时间:2010-02-25 17:35:28

标签: php performance eval

我知道,出于速度和安全原因,我们应该避免在JavaScript中使用eval。但就PHP而言,很少提及安全性。更常见的是,由于偶然使用eval,你的程序运行速度比应该慢。

在什么特定情况下你应该使用eval,因为没有别的办法吗?

为清楚起见:

我们不是在讨论用户提供的数据。所以问题集中在eval的纯粹和完全受控的服务器端有效使用。

5 个答案:

答案 0 :(得分:10)

eval的安全问题 - 在PHP中使用eval的代码与Javascript中的相同:如果你评估一些代码,你必须确定它来自哪里,以及它包含什么。< / p>

安全隐患甚至可能更大,因为PHP可以访问您的数据库(以及其他内容) - 这意味着它可以用来窃取/破坏应用程序依赖的几乎所有信息!

在Javascript中,他们说“eval is evil ”;它在PHP中可能也是如此,它在Javascript中也是如此。


现在,关于你无法避免使用eval的特定情况......好吧,在PHP开发中作为我的日常工作4年,我不记得曾经使用eval在我自己的代码中^^

但是,您需要eval的情况的示例是,例如,当您将某些代码存储在数据库中时,而不是将其缓存在文件中(可以包括在内) - 例如,某些CMS允许在管理部分中键入部分PHP代码。

答案 1 :(得分:2)

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

我们告诉孩子们不要玩刀和火柴 - 但如果使用得当,这些工具很有用(如果不是必不可少的话)。所以它具有很多PHP的功能。使用功能没有任何内在错误,只要您完全了解自己在做什么

但是,在这样一个抽象层面上讨论编程语言并不是StackOverflow的内容。

下进行。

答案 2 :(得分:0)

  

我知道应该避免使用eval   javascript的速度和安全性   原因。但在php的情况下,   很少提到安全问题。   更常见的是你的程序正在运行   因为它比它应该慢   随意使用eval。

eval在php中也是 evil

  

你应该在什么具体情况下   使用eval()因为没有其他的   绕过它吗?

首先,我们尝试尽可能地避免它,但是如果你必须使用它来执行某些代码,那么你将不得不采用它,但正如所说的那样邪恶,你使用自己的风险

底线:

绝不允许以任何速率使用eval运行用户输入。(除非您知道自己在做什么/冒险)

答案 3 :(得分:0)

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

但在某种情况下,我没有设法避免eval。我没有太多的PHP经验,所以如果有人建议我如何在没有'eval'的情况下重写代码,我会很高兴。在那种情况下,我有一个存储在变量中的类名,我不得不在该类上调用静态方法,classname来自可靠的源。所以我不得不写这样的东西:

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

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

答案 4 :(得分:0)

如果要在PHP 5.3之前使用匿名函数,则需要使用包含eval()调用的create_function