2010-02-05 65 views
1

用戶輸入相對URL我有使用用戶輸入包含文件到一個PHP腳本需要的項目。用戶輸入可以是任何相對URL(EX:/folder1/folder2/file.jpg,/資料夾/文件夾2 /)結構匹配的preg_match

請問以下是一個很簡單的正則表達式來檢查,如果輸入的是理智:

if(preg_match('/^(\/[-_a-zA-Z0-9]+)+\/?$/D', $_GET['loc'])) 
{ 
    //Location is good! 
} 

顯然我希望避免任何本地文件包含攻擊。在我得到白名單建議而不是像上面那樣包含文件之前,我有1000個文件,因此switch語句或if/else將不起作用。

回答

2

你可以把所有的文件將被包含在一個單一的目錄執行的話/x/y/data 然後執行類似下面的檢查:

$filename = realpath("/x/y/data/$_POST[location]"); 

// Make sure that $filename is under /usr/local/data  
if ('/x/y/data/' = = substr($filename, 0, 10)) { 

// safe..include the file. 

} else {  

// not safe..reject. 

} 
1

我會構建所有允許文件的白名單,只允許與之相匹配的文件。如果由於某種原因這樣做不實際,那麼我不情願嘗試某種類型的正則表達式(但路徑分隔符根據平臺而不同,所以祝你好運)。一定要用php指令open_basedir來鎖定這個東西。這至少可以減少發生事件時的損害。