我正在做一个文件上传脚本,只允许jpgs。
我使用检查脚本是文件上传限制某些文件类型
$size = getimagesize($filename);
$size['mime'];
,在大多数情况下工作。但是,如果我有一个“gif”文件,并将扩展名重命名为“jpg”,它会欺骗系统,因为该文件的MIME类型显示为jpg。
我该如何预防?
所以,JPG和PNG允许 的Gif是不允许
我正在做一个文件上传脚本,只允许jpgs。
我使用检查脚本是文件上传限制某些文件类型
$size = getimagesize($filename);
$size['mime'];
,在大多数情况下工作。但是,如果我有一个“gif”文件,并将扩展名重命名为“jpg”,它会欺骗系统,因为该文件的MIME类型显示为jpg。
我该如何预防?
所以,JPG和PNG允许 的Gif是不允许
但是,如果我有一个“GIF”文件,我改名为延伸自MIME类型,为“JPG”,其招数系统文件显示为jpg。
提取使用pathinfo()
基础文件名(不含扩展名):
$file =
pathinfo("myFakeGifImage.jpg", PATHINFO_BASENAME); // returns myFakeGifImage
,并添加基于文件类型的扩展名getimagesize()
回报的,而不是用户告诉你。
如果您只需要jpegs,请将其加载到imagecreatefromjpeg,它对伪造的jpegs错误返回FALSE。
而不是$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
此信息,随时为您最可靠的机制。
+1 - 这里列表http://www.php.net/manual/en/function.exif-imagetype.php – leonbloy 2011-05-23 16:41:39
@leonbloy:啊哈,它是!谢谢。 – 2011-05-23 17:00:27
PHP也能够检测文件的MIME类型,即通过使用mime_content_type
。这是一个安全的方法,因为它实际上检查文件的内容。
我不明白什么删除扩展将完成,除了使$ file变量无用于实际访问文件。 – 2011-05-23 16:40:12