2011-03-31 56 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

相關問題