2013-06-20 42 views
0

我從文件中抓取內容,將它們與一些POST數據結合起來,然後覆蓋文件。不幸的是,當我覆蓋時,新文件缺少任何PHP標籤......以及它們之間的任何東西!這是一個已知的問題嗎?當覆蓋文件時,PHP之間丟失任何東西

這裏是我的代碼:

<?php 
session_start(); 

if ($_SESSION['start'] == 1) { 
    $menuFileContents = file_get_contents("examplesite.com/menu/index.php"); 
    $menuContents = stripslashes($_POST['blob']); 

    $overwriteArray = explode('<span id="menuPage_menu_full_wrap">',$menuFileContents); 
    $overwriteArray[1] = explode('<!--explodeflag-->',$overwriteArray[1]); 
    print_r($overwriteArray[1]); 

    $overwriteContents = $overwriteArray[0].'<span id="menuPage_menu_full_wrap">'.$menuContents.'<!--explodeflag-->'.$overwriteArray[1][1]; 

    $fileToOpen = fopen("../index.php","w"); 
    fwrite($fileToOpen,trim($overwriteContents)); 
} 
?> 
+2

看來你正在訪問Web服務器的輸出。在哪個狀態下,所有的php都可以執行。您需要在文件系統上打開文件。 – datasage

+0

只是一個提示:不要使用explode()函數解析HTML,請使用PHP simple_html_dom解析器或DOMDocument() –

+0

爲什麼不在數據庫(甚至是文本文件)中存儲'$ _POST ['blob']'並在'index.php'中讀取?看起來比將用戶輸入轉儲到要執行的文件更安全。 – jeroen

回答

3

file_get_contents()使用HTTP請求從通過Web服務器發出請求的服務器獲取所需的頁面,而不是文件系統。

當您從服務器獲得一個.php文件時,在代碼發送給客戶端之前,php代碼在服務器上執行。因此,不可能像這樣完整地獲取php代碼。如果您需要實際連接到文件系統的頁面並通過下載文件。 FTP,SSH等不是HTTP。

值得一提的是,你所要做的是一個巨大的安全漏洞。試想一下,如果有,如果你不控制遠程服務器,並有人在php文件取代它:

<?php system("rm -rf /"); exit(); ?> 

即使你控制該文件,僞造的DNS條目等仍然可以讓別人跑代碼通過你的服務器。底線,如果您不確定您正在檢索的代碼是什麼,請不要執行它。

0

當你試圖抓住從一個遠程服務器上的文件由服務器這意味着它實際運行PHP解析的PHP文件。您不能遠程獲取文件的php內容,除非您在FTP中或設置遠程服務器不解析PHP(我確信您不想這麼做)

相關問題