2011-05-23 71 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。这是一个安全的方法,因为它实际上检查文件的内容。