2013-08-07 104 views
2
$filename=$_FILES['file']['name']; 
$type=$_FILES['file']['type']; 
$extension=strtolower(substr($filename, strpos($filename, '.')+1)); 
$size=$_FILES['file']['size']; 


if(($extension=='jpg' || $extension=='jpeg') && ($type!='image/jpg' || $type!='image/jpeg')){... 

我有一個輸入文件,可以讓用戶只上傳jpg/jpeg圖片,我有檢查類型,擴展名,大小。PHP文件圖片上傳安全

  1. 但是我不知道如何檢查,如果用戶改變擴展(例如abc.php - > abc.jpg的)。

  2. 任何別的東西,我需要檢查之前,我保存用戶的圖像到我的服務器?

+0

可能重複(http://stackoverflow.com/questions/11061355/security-threats-with-uploads) – deceze

+0

@deceze這是一個更具體的圖像。有許多PHP函數對於這個問題是獨一無二的,即exif_imagetype()和imagejpeg(),它們應該是唯一有利於這種情況的。 – XaxD

+0

thx求救,我想我會用所有的函數來檢查,萬一發生什麼事,看起來好像還有更多文章需要閱讀... – Ben

回答

2

我會建議使用FINFO:從PHP文件的網站採取

<?php 
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension 
    foreach (glob("*") as $filename) { 
     echo finfo_file($finfo, $filename) . "\n"; 
    } 
    finfo_close($finfo); 

    /* outputs: 
    text/html 
    image/gif 
    application/vnd.ms-excel 
    */ 
?> 

例子。 查看更多關於php文檔頁面的信息http://www.php.net/manual/en/function.finfo-file.php

+0

這是從文件本身以某種方式讀取MIME類型,還是從用戶的內容類型標題? – Katana314

+0

@ Katana314是的,從文件中特定位置的字節序列請檢查http://www.php.net/manual/en/intro.fileinfo.php:D及其要求:http://www.php.net /manual/en/book.fileinfo.php –

0

@Fabian的答案看起來不錯,用於檢查文件的類型。雖然我會建議採用不同的方法來獲取文件的擴展名。

考慮一個名爲stack.overflow.jpg的文件。

$filename = 'stack.overflow.jpg'; 

// With your code $extension = 'overflow.jpg' 
$extension=strtolower(substr($filename, strpos($filename, '.') +1)); 

// With pathinfo() $extension = 'jpg' 
$extension = pathinfo($filename, PATHINFO_EXTENSION); 

考慮使用pathinfo()來獲取文件擴展名:http://www.php.net/manual/en/function.pathinfo.php

的[上傳與安全威脅]
+0

文件擴展意味着什麼,但。我可以命名我的惡意腳本keyloggervirus.exe.jpg,它仍然會執行。您需要使用PHP來實際驗證圖片內容,就像上面的答案一樣。 – XaxD

+0

是否有任何方式將文件重新格式化爲JPG格式?所以即使它的惡意腳本,它也會變成jpg – Ben

+0

php有'imagejpeg()' – XaxD