2016-04-07 76 views
5

我總是確信PHP函數file_get_contentsreadfile在任何文件中執行任何PHP代碼 - 無論文件類型如何 - 都會被賦予它。我在多個設置上嘗試了這個,並且它一直工作。做file_get_contents和readfile執行PHP代碼?

我收到了關於這個here一個問題,用戶似乎認爲這種情況並非如此。

我看着的函數的PHP文件,他們不提代碼執行(這是一件好事,如果這通常是這種情況,因爲它有嚴重的安全隱患,我所期望的)。

我也搜索了它,並發現了大量的功能不執行PHP代碼索賠。例如:

readfile不會在您的服務器上執行代碼,所以這裏沒有問題。 source

搜索「PHP的file_get_contents執行代碼」也返回試圖執行檢索PHP代碼,這似乎很奇怪,如果它確實會正常執行任何PHP代碼的各種問題。

我還發現one question詢問沒有執行PHP代碼,所以執行似乎也發生在其他人身上。

所以我的問題是:

  • 做檢索到的文件的功能file_get_contentsreadfile執行PHP代碼?
  • 這是否取決於一些php.ini設置?如果是這樣,什麼設置?
  • 是否依賴於PHP版本,如果有,哪些版本會受到影響?
  • 如果通常情況不是這樣,他們在我的設置中執行PHP代碼的原因是什麼?
+0

似乎更多的是編程問題而不是安全問題。你檢查了php.net手冊嗎?似乎沒有執行我... –

+0

我真的很想看到一個代碼示例,其中「that works」... – deceze

回答

7

file_get_contentsreadfile不執行代碼。他們所做的只是返回文件的原始內容。這可能是文本,PHP代碼,二進制文件(例如圖像文件)或其他任何東西。根本沒有對文件內容的解釋。

其中可能出現彷彿執行發生的唯一情況是:

  1. <?php ?>標籤可能會被瀏覽器,因爲它試圖將其解釋爲HTML標籤被隱藏,因此這可能導致給人的印象是PHP消失了,因此可能已經被執行了。
  2. 您正在閱讀的是來自的,它執行代碼,例如,當從http://example.com/foo.php讀。在這種情況下,這些函數與在Web瀏覽器中訪問這些URL的效果相同:服務Web服務器正在執行PHP代碼並返回結果,但file_get_contents僅獲取該結果並將其返回。
6

這些功能是在«函數參考/文件系統相關擴展/文件系統描述的手動的»截面,而執行代碼功能在«函數參考/過程控制擴展»說明。

我敢肯定,誤解來自於文件系統和網絡之間普遍存在的混淆,而PHP流功能使得協議包裝可以使用相同的功能來透明地打開任何類型的資源:本地文件,網絡資源,壓縮歸檔等在這裏我看到無盡的帖裏有人做這樣的事情:

file_get_contents('http://example.com/inc/database.inc.php'); 

...並想知道爲什麼他不能看到這個數據庫連接。答案很清楚:你沒有加載文件,你正在獲取一個URL。結果,database.inc.php中的代碼得到有效執行...雖然相當間接。