2013-04-26 55 views
0

我已閱讀安全PHP上傳腳本線程,但我很難讓這個已知的好腳本接受更改。我想讓這個腳本只允許.jpeg,.png和.gif文件。有人能告訴我如何修改這個腳本來做到這一點嗎?我如何保護這個PHP上傳腳本

<?php 
$result=0; 
if (trim($_POST["action"]) == "Upload File") { //**** User Clicked the Upload File Button 

    //*********** Execute the Following Code to Upload File ************* 
    $imagename = basename($_FILES['image_file']['name']); // grab name of file 
    $result = @move_uploaded_file($_FILES['image_file']['tmp_name'], $imagename); // upload it 
    if ($result==1) echo("Successfully uploaded: <b>".$imagename."</b>"); // did it work? 

} // end if 
?> 
<?php 
if ($result==1) echo("<img src='".$imagename."'>"); // display the uploaded file 
?> 
+0

你可能喜歡的東西在開始[這個鏈接](http://webcheatsheet.com/PHP/file_upload.php),根據你的需要修改它,如果不起作用,我們可以從那裏獲得幫助。 – 2013-04-26 21:44:01

+0

你絕對需要開始測試成功的上傳,做服務器端MIME類型檢查,絕對**必須**停止使用'@'運算符。 – 2013-04-26 21:45:00

+0

除了不適宜使用用戶提供的文件名以及從與應用程序相同的域提供用戶提供的文件外,您還得到了HTML注入(導致XSS)。 – bobince 2013-04-28 01:39:11

回答

0

爲了簡潔起見,我沒有做任何錯誤檢查..但你可以評估的文件這樣的擴展:

$filename = $_FILES['image_file']['name']; 
$ext = pathinfo($filename, PATHINFO_EXTENSION); 
if($ext !== 'jpg' && $ext !== 'png' && $ext !== 'gif') {echo 'error';} 
+0

它看起來像是成功標識了這些文件,但它並沒有阻止文件上傳。有沒有辦法在識別非(png,jpeg,zip)文件時終止上傳? – Alexk 2013-04-26 22:06:55

+0

一旦你處於這個PHP腳本的位置,這些文件就已經在你的服務器上了。你所能做的就是決定你是否想對它們運行一些進程。在這種情況下,可能會刪除該文件並使用die()終止腳本; – Kevin 2013-04-26 22:10:47

+0

如果您想在上傳到服務器之前停止上傳,可以使用javascript進行過濾。看到這個答案的更多信息:http://stackoverflow.com/questions/71944/how-do-i-validate-the-file-type-of-a-file-upload – Kevin 2013-04-26 22:13:38

1
$filename = $_FILES['image_file']['name']; 
$ext = pathinfo($filename, PATHINFO_EXTENSION); 
if($ext !== 'jpg' && $ext !== 'png' && $ext !== 'gif') {echo 'error';} 

是一個非常糟糕的主意進行驗證。

echo '<pre>'; 
$filename = 'image.php\0.jpg'; 

$extension = pathinfo($filename, PATHINFO_EXTENSION); 
var_dump($ext); 

的顯示的var_dump JPG

而PHP函數move_uploaded_file是與空字節\ 0脆弱。 的move_uploaded_file後,服務器將創建一個image.php文件..

1

如果你想到達服務器之前阻止上傳,您可以用JavaScript過濾。看到這個SO回答更多信息:stackoverflow.com/questions/71944/... - 在客戶端驗證Kevin Apr 26 at 22:13

永遠永遠永遠永遠neverever把信任......


編碼一個安全的上傳很難。很難。

您不能信任文件擴展名或MIME類型,因爲客戶端可以更改此設置。

如果你只想上傳gif,jpeg或png,你可以採取這些步驟。使用PNG,你可能會遇到麻煩,因爲編碼可能會繞過其中一些。

  1. 通過file_get_contents()讀取臨時文件。
  2. 運行strip_tags()就可以了。
  3. 與GD庫
  4. 即成由read()圖像創建新的圖像 - 不要使用include()require()
  5. 禁用PHP引擎對目錄