我知道,出于速度和安全原因,我们应该避免在JavaScript中使用eval
。但就PHP而言,很少提及安全性。更常见的是,由于偶然使用eval
,你的程序运行速度比应该慢。
在什么特定情况下你应该使用eval
,因为没有别的办法吗?
为清楚起见:
我们不是在讨论用户提供的数据。所以问题集中在eval
的纯粹和完全受控的服务器端有效使用。
答案 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。