Eval(),有什么意义?

时间:2011-01-25 18:25:44

标签: php eval

关于eval()作为功能的官方文档说:

  

除此之外,这对于将代码存储在数据库文本字段中以供以后执行非常有用。

我对此感到非常困惑。 PHP文档是否建议将PHP行存储到数据库中?什么?这不是一件令人不安的事吗?

如果我知道在数据库中有一个以PHP形式执行的字符串怎么办?这不是非常危险吗?我只需要一个Sql注入来做任何我想要的网站,我想要的任何东西。我可以删除整个数据库,我可以从脚本中获取所有内容,我可以做任何事情。

这怎么会这么有用?

能否请您提供一些关于eval()如何有用的示例? 另外,我可能遗漏了一些东西,为什么我看到了一些代码:

eval("if (is_int($int)) { return false }");

而不仅仅是

if (is_int($int)) { return false }

但是,正如我所说,我可能错过了什么:什么?

6 个答案:

答案 0 :(得分:7)

eval()功能太棒了!人们一直使用它来注入代码并始终获得对服务器的出色访问。您经常会看到eval()和正则表达式函数的使用,这些函数还会在破坏的WordPress安装中执行。

您需要eval的原因很少。例如,如果我正在创建一个PHP测试站点,人们可以在页面上输入一些代码然后运行它。当然,由于你列出的原因,它需要首先进行消毒。

答案 1 :(得分:4)

假设您有一个允许您键入PHP代码的CMS。我可以看到使用eval函数来评估该PHP代码段。由于同样的原因,Javascript也有eval。

除了所有原因,eval非常不安全。我同意不应该使用它。

答案 2 :(得分:3)

是的,这可能非常危险。我看到它使用的一个地方是一个允许搜索屏幕非常复杂配置的系统,并允许用户保存搜索配置。搜索的详细信息保存为以eval执行的实际代码。 输入分别存储并检查(在某种程度上,我不知道详细信息)以防止SQL注入。那是我唯一一次看到这样做的时间,而且可能没有必要(虽然我从来没有看到足够的这个系统来确定)。

当你不知道在运行时需要执行什么代码时,

eval()可能很有用(就像我上面给出的例子),但这些情况并不是大多数开发人员每天都会发生的事情。如果您遇到需要 eval()的情况,请尝试确保从不直接传递输入来自用户。更好的是,如果你能找到一种方法来约束(在某种程度上)将传递给它的代码,但这将取决于手头的问题。

答案 3 :(得分:2)

  

你能否提供一些关于这个eval()如何有用的例子?

例如,模板引擎使用它。他们将模板解析并编译为PHP代码,并可以将代码存储到任何位置,或者直接使用eval()执行。

除此之外,这是一个危险的特征。

答案 4 :(得分:1)

确实,它确实不安全,无论如何都必须清理你的代码。

但是,它无意评估用户引入的表达式或任何其他方式,例如来自DB。

当语言不提供元编程时,我发现它很有用。因此,例如,您需要填充一个带有50个字段的bean,这些字段被称为相同但方法名称之间的差别很小,例如数字(想象它有field1(),field2(),field3()......等等) ,然后你可以使用for中的eval:将方法名称构造为字符串,然后调用它。

通过这种方式,您可以在5中转换100行重复的代码行,如果您想要添加有关其工作原理的文档,可以转换更多行代码。这不是不安全的,因为没有人在这里接触你的代码。

答案 5 :(得分:0)

您可以拥有类似

的内容
$text = 'This is some random number: $number. Hello world!';
...
$number = 15;
...
eval ("\$replacedText = \"$text\";");

在eval中,$ text将替换为“这是一个随机数:$ number.Hello world!”,并且eval确保$ number也被15替换