php伪装图片,案例分析之PHP文件上传时,如何识别文件伪装?

本帖最后由 huawei 于 2017-3-5 10:35 编辑

文件上传之识别文件伪装

PHP学院  教学总监  孙静

在web开发过程中文件上传是不可绕过的话题,上传文件的时候需要验证上传的文件是否合法。通常情况下使用文件扩展名和文件类型来验证是不能识别文件伪装的,我们需要使用php_fileinfo.dll扩展来识别文件伪装。

我们来测试一下,首先准备好文件上传的表单:

[HTML] 纯文本查看 复制代码

图片上传:

然后我们在做一个用记事本伪装的图片

1、我们在硬盘上新建一个记事本文件

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

图片1.png (1.21 KB, 下载次数: 131)

2016-12-17 21:43 上传

2、将记事本改为“image.jpg”

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

图片2.png (1.02 KB, 下载次数: 158)

2016-12-17 21:43 上传

这时候从外观上看起来是个图片,但实际上是个记事本文件,此时我们成功将记事本伪装成图片

下面我们来验证一下那种方法可以识别文件伪装

1.1.1 方法一:通过获取文件路径信息来判断

我们通过pathinfo()函数用来获取文件路径的信息,

[PHP] 纯文本查看 复制代码<?php

if(isset($_POST['button'])) {

$info=pathinfo($_FILES['image']['name']);

echo '

';

print_r($info);

}

?>

选择我们刚才伪装的图片文件“image.jpg”,点击“上传”,我们可以看到如下结果

[PHP] 纯文本查看 复制代码Array

(

[dirname] => .

[basename] => image.jpg

[extension] => jpg

[filename] => image

)

结果中[extension] => jpg,说明pathinfo()没有识别出图片伪装。

1.1.2 方法二:使用$_FILES获取文件类型来判断

$_FILES[]['type']用来获取文件的MIME类型

[PHP] 纯文本查看 复制代码<?php

if(isset($_POST['button'])) {

echo $_FILES['image']['type'];

}

?>

再伪装的图片文件“image.jpg”,点击“上传”,我们可以看到如下结果

[PHP] 纯文本查看 复制代码image/jpeg

说明通过$_FILES获取文件的MIME格式也不能识别图片伪装

1.1.3 方法三:使用php_fileinfo扩展来判断

在使用php_fileinfo.dll扩展之前必须先在php.ini中开启php_fileinfo.dll扩展

开启扩展后,我们就可以使用php_fileinfo.dll了,使用php_fileinfo.dll扩展很简单,只要两步即可。

第一步:创建一个 fileinfo 资源,用此资源获取文件mime类型和编码

[PHP] 纯文本查看 复制代码$finfo=finfo_open(FILEINFO_MIME);

游客,如果您要查看本帖隐藏内容请回复

输出结果是“inode/x-empty; charset=binary”,我们可以看到php_fileinfo.dll扩展能识别image.jpg是伪装的图片,此文件本质是二进制编码的空文件。

1.1.4 结论

要识别文件伪装需要使用php_fileinfo扩展。

精华推荐: