2011-05-23 68 views
3

我正在做一個文件上傳腳本,只允許jpgs。
我使用檢查腳本是文件上傳限制某些文件類型

$size = getimagesize($filename); 
$size['mime']; 

,在大多數情況下工作。但是,如果我有一個「gif」文件,並將擴展名重命名爲「jpg」,它會欺騙系統,因爲該文件的MIME類型顯示爲jpg。

我該如何預防?

所以,JPG和PNG允許 的Gif是不允許

回答

1

但是,如果我有一個「GIF」文件,我改名爲延伸自MIME類型,爲「JPG」,其招數系統文件顯示爲jpg。

提取使用pathinfo()基礎文件名(不含擴展名):

$file = 
pathinfo("myFakeGifImage.jpg", PATHINFO_BASENAME); // returns myFakeGifImage 

,並添加基於文件類型的擴展名getimagesize()回報的,而不是用戶告訴你。

+0

我不明白什麼刪除擴展將完成,除了使$ file變量無用於實際訪問文件。 – 2011-05-23 16:40:12

0

如果您只需要jpegs,請將其加載到imagecreatefromjpeg,它對僞造的jpegs錯誤返回FALSE。

3

而不是$size['mime'](您已經認識到,它是MIME類型,因此不完全可靠),請使用$size[2]

The manual entry說,它包含

指示圖像的類型IMAGETYPE_XXX常數之一。

註釋進一步下跌的頁面方便地列出了這些常量:通過檢查文件本身,並因此產生

1 = GIF 
2 = JPG 
3 = PNG 
4 = SWF 
5 = PSD 
6 = BMP 
7 = TIFF (Intel byte order) 
8 = TIFF (Motorola byte order) 
9 = JPC 
10 = JP2 
11 = JPX 
12 = JB2 
13 = SWC 
14 = IFF 
15 = WBMP 
16 = XBM 

此信息,隨時爲您最可靠的機制。

+0

+1 - 這裏列表http://www.php.net/manual/en/function.exif-imagetype.php – leonbloy 2011-05-23 16:41:39

+0

@leonbloy:啊哈,它是!謝謝。 – 2011-05-23 17:00:27

0

PHP也能夠檢測文件的MIME類型,即通過使用mime_content_type。這是一個安全的方法,因爲它實際上檢查文件的內容。