2011-03-31 60 views
5

我已经经历一个WordPress插件的代码,发现了以下内容:什么时候(如果有的话)可以在PHP中执行此操作吗?

eval('?>' . $foo . '<?php ');

我很好奇,如果有一些具体的情况我不知道,这将是正道输出$foo变量。这只是一个插件作者古怪的例子,或者是我应该知道的吗?我刚使用echo ...

UPDATE:

感谢所有伟大的反馈。我现在面对的是,我没有想到模板场景。具体来说,这发生在WP Super Cache插件中。我想我必须仔细看看是否有必要。我认为超级缓存在所有的PHP已经被处理后缓存了Wordpress的html输出...

+4

这仅仅是horroristic。 – vbence 2011-03-31 20:58:01

+0

那行代码会给我做噩梦O.o – 2011-03-31 21:06:03

回答

6

在这种情况下,$foo是一个字符串(推测)可以包含内嵌的PHP代码。因此,要执行此PHP代码,字符串需要为eval'ed。

也就是说,使用eval一般是令人难以接受的,从在非常狭隘的情况分开,因为这可能会导致恶意代码的执行。 (举例来说,如果有任何可能性,$foo为用户提供的字符串,然后使用eval可能导致灾难性的后果。)

看到现有When is eval evil in php?问题/答案,了解更多信息。

+0

但它不会是PHP代码,会吗?因为你也在评估这些密切和开放的标签。 '$ foo'必须包含HTML或其他内容,对吧? (但显然,在一个字符串中。) – sdleihssirhc 2011-03-31 20:57:50

+0

@sdleihssirhc:宾果。这通常用于执行模板代码,主要是PHP或PHP,需要各种字符串级别的操作才能工作。 – Charles 2011-03-31 21:00:21

+0

@sdleihssirhc添加开始和结束标记是必要的,除非字符串是*只是* PHP代码,而不是包含嵌入式PHP标记的字符串。 – 2011-03-31 21:00:24

2

这不是输出变量。 $foo最有可能包含一个模板,其他<?=$code();?>代码片段包含在内。

关闭和打开PHP标记用于此评估从内联代码切换回HTML模式。这eval()函数或多或少达:

include("data:,$foo"); // treat $foo string as if it was include script 
+0

只是发生'include'方法需要'allow_url_include'被启用,而eval方法则不需要。郁闷... – Charles 2011-03-31 21:02:19

+0

是的。另一个解决方法是将其保存到临时文件中。 (但我会考虑*,甚至更糟 - 更糟糕。) – mario 2011-03-31 21:04:43

+0

这将是精神上的融化。猜猜Smarty是如何工作的! – Charles 2011-03-31 21:50:40

-1

让我再重申一遍:C.R.A.P

如果的eval()就是答案,你几乎肯定 问错了问题。

拉斯姆斯·勒多夫

+1

-1你的“答案”如何帮助OP? – 2011-03-31 21:01:34

+0

仅供参考,请注意,我没有这样做。我在一个插件中发现它。 – Endophage 2011-03-31 21:05:06

+0

来吧,我喜欢我的用户名下的2112。插件作者古怪,Endophage只使用'echo'。 @Endophage,从未说过你做过,而你不应该这样做。 – 2011-03-31 21:05:30

相关问题