2009-08-26 48 views
0

我正在研究一個腳本,允許用戶瀏覽給定的目錄,這不是該文件所在的目錄,而是設置在一個變量中。列出文件夾內容:如何防止用戶超出授權目錄?

define('FOLDER', '../_files/'); 

現在,百頁html允許瀏覽該文件夾內的子文件夾。我使用「dir」GET變量來告訴我的腳本要顯示哪個子文件夾的內容,並使用相同的dir變量允許向上移動的「..」鏈接。

我設置了一個檢查,如果$ _GET ['dir']等於文件夾,它不應該顯示該「..」鏈接。但是,容易混淆位於url中的變量,無論我在哪裏做,我的腳本允許瀏覽授權文件夾之上。不完全是安全的情況...

所以我想我應該檢查授權目錄的完整本地路徑對所請求的目錄,如果後者不在授權的內部,不顯示「..」 。

但我不知道該怎麼做。任何提示或指針,將不勝感激。謝謝

+0

即使標題不送人,這基本上是因爲http://stackoverflow.com/questions/1066930/sending-variables-同樣的問題for-php-filesystem-functions-with-form-submission/ – deceze 2009-08-26 08:44:11

+0

是的,類似的問題/解決方案。 – 2009-08-26 08:46:56

回答

1

你可能想看看realpath()

$foo = realpath($foo); 
if (substr($foo, 0, 8) != '/my/path') { 
    return false; 
} 

...或類似的東西。

複製自this answer,因爲我覺得這個問題比較好。

+0

謝謝。 $ foo是請求的目錄,並且/ my/path /授權的,對吧? – pixeline 2009-08-26 08:57:09

+0

沒錯。 :) – deceze 2009-08-26 08:58:38

0

或者你可以使用正則表達式

$requested = realpath($foo); 
$allowedpath = '/path/to/allowed'; 

$regex = '/^'.addslashes($allowedpath).'\/?.*$/'; 

if (!preg_match($regex, $requested)) { 
    return false; 
} 
+0

您應該使用preg_quote()而不是addslashes()。 – 2009-08-26 09:34:03

+0

preg_quote()不會替代我的斜線,因爲正則表達式的開始和結束字符幾乎可以是任何東西,但是您可以將它另外添加到addslashes() – stefita 2009-08-26 10:01:32

相關問題