PHP面试题:如何校验您上传的文件是一张合法的图片格式?

icode 后端 2019-06-13

如何校验您上传的文件是一张合法的图片格式?这是PHP程序员在面试过程中常遇到的一个问题。笔者曾经也面试过若干PHPer,回答都不尽如人意。

大部分的回答如下

  • 检查文件后缀是不是.jpg/.gif/.png

这种方案最常见,其实也是有巨大漏洞的,比如我完全可以把一个.js的脚本改成.jpg后缀。这样就能顺利的绕开这种检查机制,更为致命的是:这个伪造的图片在某些浏览器上能够以js脚本的方式执行(比如江湖传说:IE6)。

  • 用正则匹配文件内容是不是图片

这个我也懵,我也不知道怎么正则…

PHP面试题:如何校验您上传的文件是一张合法的图片格式?

总体来说,以上两种方法都有较大问题,下面举一个我经常用的方案。很简单就是利用PHP的自带函数 getimagesize()。

getimagesize() 简介:

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

语法格式:

array getimagesize ( string $filename [, array &$imageinfo ] )

代码示例:

根据说明,我们可以通过该函数校验图片格式合法性,假如我们上传表单的字段名是logo。则代码如下:

<?php
if(!is_array(getimagesize($_FILES['file']['tmp_name']))){
	return '不是合法图片';
}

当然,我这只是抛转引玉,有更好的办法大家可以留言交流。

评论