用getimagesize来判断上传图片的类型比$_FILES函数的type​​更可靠

2014年08月28日 16:18 by:blogguy_cn

导读: $_FILES函数的type​​获取图片类型并不安全,实例测试为什么说$_FILES['file']['type']判断图片类型不安全的原因. 用getimagesize函数来获取图片类型​更可靠.

$_FILES函数的type获取文件属性并不安全

php的$_FILES函数是一个很好用的函数,但是这个函数的type不是由php去读取文件的信息,而是由浏览器提供的。

换句话说:同一个文件,使用不同的浏览器php返回的type类型是不一样的,由浏览器提供type类型的话,就有可能被黑客利用向服务器提交一个伪装撑图片后缀的可执行文件。

为什么说$_FILES['file']['type']获取文件属性不安全呢?

举个简单的例子, 如下:

  1. <?
  2. $file=$_FILES['file'];
  3. if(!empty($file)){
  4.  var_dump($file);
  5. }
  6. ?>
  7. <form method="post" enctype="multipart/form-data" action="upload.php">
  8.  请选择文件: <br>
  9. <input name="file" type="file"><br>
  10. <input type="submit" value="上传文件"> 
  11. </form>

分别用ie和firefox浏览器测试一下,看看返回内容。

大小: 48.25 K
尺寸: 390 x 331
浏览: 21 次
点击打开新窗口浏览全图 大小: 43.24 K
尺寸: 318 x 311
浏览: 15 次
点击打开新窗口浏览全图

看清楚了吧,返回值不一样,原因是什么呢?原因就是不同的浏览器定义的不同文件类型的mime不一样,所以用这招判断文件上传是否合法是很危险的,具体不多说了。

用getimagesize函数来获取图片类型更可靠

如果仅允许上传图片,可以用getimagesize函数来获取文件类型

修改代码如下

  1. <?
  2. $file=$_FILES['file'];
  3. if(!empty($file)){
  4.  var_dump($file);
  5.  var_dump(getimagesize($file["tmp_name"]));
  6. }
  7. ?>
  8. <form method="post" enctype="multipart/form-data" action="upload.php">
  9.  请选择文件: <br>
  10. <input name="file" type="file"><br>
  11. <input type="submit" value="上传文件"> 
  12. </form>
看看效果你就明白了。

大小: 67.33 K
尺寸: 412 x 408
浏览: 17 次
点击打开新窗口浏览全图  大小: 67.12 K
尺寸: 326 x 427
浏览: 15 次
点击打开新窗口浏览全图

上传图片的时候尽量用getimagesize来判断是否图片吧。

当然图片使用文件扩展名+getimagesize的mime来来个双判断效果会更好.