2015-06-27 133 views
4

我有問題。我有一個PHP腳本(PHP 5),它將URL參數$_GET['file']保存到變量$file。現在有辦法檢查這個變量是否是一個有效的文件名(例如:hello.txt而不是/../otherdir/secret.txt)。因爲沒有檢查$ file變量,黑客就可以使用/../來到我的父文件夾。檢查字符串是否有效文件名

+1

您是否嘗試過的東西?或寫了一些僞代碼?或做了一些研究? – Rizier123

+1

只需刪除'/' – adeneo

回答

4

您可以在PHP的basename功能看,它會與文件名返回,見下面的例子:

$file = '../../abc.txt'; 
echo basename($file); //output: abc.txt 

注:basename讓你從路徑字符串的文件名,不論文件的實際存在與否。可以使用file_exists函數來驗證文件物理存在。

+0

非常感謝! <3 – askerno

+3

作爲一個方面說明,這並不真正檢查文件名是否爲「有效」。它只是簡單地刪除最後一個PHP目錄分隔符。我明白OP的意圖是要做到這一點。但其他人可能會認爲這證實了一些事情 - 事實並非如此。 –

-1

會這樣嗎? http://php.net/manual/en/function.file-exists.php E.g,你的情況,

if(file_exists(str_replace("../", "", $file))){ 
    // valid 
} 
else{ 
    // invalid 
} 

文件可以在子文件夾,但不是在父文件夾。

但是,如果你在文件名有興趣,

if(file_exists(pathinfo($file, PATHINFO_BASENAME))){ 
    // valid 
} 
else{ 
    // invalid 
} 

應該工作。

+0

之前的所有內容即可正常工作,但我認爲kamal pal的版本更加緊湊​​,我不想轉到子文件夾..但是也要感謝您<3 – askerno

-2

我會想結合卡邁勒朋友的和Pancake_M0nster的回答創建簡單:

if(file_exists(basename($file))){ 
    // valid 
} 
else{ 
    // invalid 
} 
+0

結合兩種不同的解決方案並不總是提供更好或更有效的答案。有時候,它甚至會破壞功能:在這種情況下,只有'$ file'與主腳本位於同一目錄時,結果纔會是「真」。 –