2012-02-20 97 views
0

我正在尋找檢查遍歷路徑的最佳方法。目前,該路分爲兩個部分,在$ user_root和$ input_path象下面這樣:安全檢查路徑和文件名是否對RegEx有效?

$user_root = '/var/www/users_root'; 
$input_path = '../../../'; 
$full_path = $user_root + $input_path; 

我沒用,當談到正則表達式。我想檢查遍歷(如果可能,刪除)以及檢查正確的字符在路徑& unix和windows的文件名。

謝謝

+0

@DC_大部分只是用str_replace玩,但可以看到正則表達式是一個更好的選擇。 – arbme 2012-02-23 00:56:39

回答

1

爲什麼不在$ input_path中檢查「../」?另外,你認爲什麼是「正確的字符」?我假設A-Z,a-z和0-9都很好。連字符,下劃線和空格怎麼樣?大多數標點符號在unix和linux中的文件(和目錄)名稱中有效,但是您尚未指定您正在使用的操作系統。

if (strpos($input_path, "../") > 0) { 
    die("Obvious attempt to look behind the curtain"); 
} else 
if (preg_match("/[^A-Za-z0-9_./-]/", $input_path) { 
    die("Illegal characters"); 
} else { 
    // do something useful 
} 

鹽味道。

請注意,正則表達式中方括號內的連字符必須緊靠開始或結束方括號旁邊,或者必須轉義。因此,在正則表達式中,[a-z0-9_-]表示字母數字加下劃線和連字符。但是[a-z0-9-_]是一個錯誤。

+0

我的意思是在unix和windows中允許使用目錄和文件的字符。上述內容對此是否正確? – arbme 2012-02-23 00:55:47

+0

你應該看看[在ServerFault這個答案](http://serverfault.com/questions/150740/linux-windows-unix-file-names-which-characters-are-allowed-which-are-unesc)。爲了安全起見,除了你知道的好之外,不要接受任何東西,比如'[^ a-zA-Z0-9 ._-]'。如果你不允許斜槓,「../」永遠不會出現。 – Graham 2012-02-23 12:40:36

相關問題