PHP手记:文件上传时,如何识别文件伪装!

原创 2016-12-22 15:01:47 770
摘要:在web开发过程中文件上传是不可绕过的话题,上传文件的时候需要验证上传的文件是否合法。通常情况下使用文件扩展名和文件类型来验证是不能识别文件伪装的,我们需要使用php_fileinfo.dll扩展来识别文件伪装。我们来测试一下,首先准备好文件上传的表单:<form method="post" action="" encty

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

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

<form method="post" action="" enctype="multipart/form-data">
        图片上传: <input type="file" name="image">
        <input type="submit" name="button" value="上传">
</form>

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

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

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

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

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

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

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

<?php
if(isset($_POST['button'])) {
        $info=pathinfo($_FILES['image']['name']);
        echo '<pre>';
        print_r($info);
}
?>

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

Array
(
    [dirname] => .
    [basename] => image.jpg
    [extension] => jpg
    [filename] => image
)

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

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

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

<?php
if(isset($_POST['button'])) {
        echo $_FILES['image']['type'];
}
?>

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

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);

第二步:通过fileinfo 资源匹配文件信息,并返回文件的信息

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

$info=finfo_file($finfo,$file);

完整代码如下

<?php
if(isset($_POST['button'])) {
        $finfo=finfo_open(FILEINFO_MIME);//创建fileinfo资源,用来获取文件的mime类型和编码
        $info=finfo_file($finfo,$_FILES['image']['tmp_name']);//返回文件的mime类型和编码
        echo $info;
}
?>

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

1.1.4 结论

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

更多关于PHP文件上传时,如何识别文件伪装的手记请关注PHP中文网手记其它文章!

发布手记

热门词条