2016-01-09 104 views
0

首先我會從書中直接引用編譯PHP下載鏈接

基名()提取路徑的文件名部分,所以如果 基本名($ _ GET [「文件」])是不同的從$ _GET ['file'],你知道有一個嘗試 探測你的服務器。

假設我有這個下載鏈接。

<a href="download.php?file=image.jpeg">Click here to download image</a> 

和的download.php文件,我有這行代碼:

if (isset($_GET['file']) && basename($_GET['file']) == $_GET['file']) { 
    // do something with the file 
} 

如果我更改文件查詢中的鏈接(從瀏覽器的地址欄),比方說,我改變它於:

download.php?file=passwords.txt 

從我可以從的download.php條件線看,它不會使在文件查詢鏈接的檢查的差異,病情可以被理解爲:

isset($_GET['file']) // This evaluates to TRUE because now it contains passwords.txt 
basename($_GET['file']) // This will contain passwords.txt 
$_GET['file'] // This will contain passwords.txt 

這是否意味着試圖阻止用戶使用download.php中的條件從瀏覽器注入惡意查詢是錯誤的?至少使用書中的代碼。

我可以使用數組來存儲用戶可以安全下載的有效文件,並使用in_array()函數進行檢查。還是說我讀錯了代碼?

基本上我想在這裏說的是,如果你改變鏈接中的文件查詢,download.php中的條件總是計算爲true。我對嗎?

回答

0

是的你是對的。見basename()

顯然它不是「書」,它只是「一本書」,我不能評論,因爲我不知道上下文。一個簡單的實現不會改變你的代碼很多是檢查是否有一個文件具有該路徑,並有一個數據庫表與您允許下載的文件。還有更多的方法需要你改變很多,但他們更好。例如。絕不要在pubic_html中擁有自己的src或存儲庫,並根據用戶權限授予下載權限

+0

感謝您的回覆。我只是想知道我讀的代碼是正確的。 –