2014-01-05 95 views
0

我有這樣的PHP代碼:如何在本PHP代碼中防止本地文件下載?

<?php 

header("Content-Type: application/force-download"); 
header("Content-Disposition: attachment; filename=\"".$_GET['name']."\""); 
$file_content = file_get_contents($_GET['name']); 
echo $file_content; 

?> 

在這種情況下,攻擊者可以申請在我的網站上下載文件:

localhost/file.php?name=../../../../../../../etc/passwd

我需要一種方法來防止用戶下載任何東西從當前目錄中除去.zip文件。

+0

如果(!strpos($ _ GET [ '名'], '..')==假)退出; –

+1

@IgorPantović這是不夠的,只是開始使用絕對路徑名稱 –

+0

@MichaelHelwig噢,我的確,可怕的疏忽。 –

回答

1

在打開文件之前,您應該檢查$_GET['name']的內容是否合法。

特別是,在你的情況,請檢查:

  • .zip
  • 它不包含一個NULL字節,以防止過早終止字符串結尾(見Null bytes related issues
  • 它不包含路徑分隔符(/\)。

下面是一個例子:

$filename = $_GET['name']; 
if (strpos($filename, "\0") !== false) { 
    // contains NUL byte 
} else if (substr(strtolower($filename), -4) !== '.zip') { 
    // doesn’t end with ".zip" 
} else if (basename($filename) !== $filename) { 
    // contains path separator 
} else if (!is_file($filename)) { 
    // file does not exist 
} else { 
    // everything is fine 
} 
+0

這還不夠。只要想一想'/ etc/passwd%00.zip'(以'.zip'結尾,但包含字符串終止NUL字節)或'./../../ etc/passwd'(不以'..'開頭)。 – Gumbo

+0

的確,我錯過了一些案例。我相應地調整了我的答案。 (但是,我沒有提到NUL字節技巧,因爲我不確定我完全理解它) – gturri

+0

它仍然不夠/不夠準確。 – Gumbo

相關問題