A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

文件上传之识别文件伪装


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

        我们来测试一下,首先准备好文件上传的表单:
[HTML] 纯文本查看 复制代码
<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] 纯文本查看 复制代码
<?php
if(isset($_POST['button'])) {
        $info=pathinfo($_FILES['image']['name']);
        echo '<pre>';
        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扩展。


精华推荐:

视频集合:众多老学员呐喊:"为什么我选传智PHP"!

41 个回复

倒序浏览
谢谢分享!!!
回复 使用道具 举报
跟着大神打天下
回复 使用道具 举报
回复 使用道具 举报
来学习学习
回复 使用道具 举报
案例分析之PHP文件上传时,如何识别文件伪装?
回复 使用道具 举报
6666666666666666666
回复 使用道具 举报
学习一下
回复 使用道具 举报
感谢楼主分享
回复 使用道具 举报
RE: 案例分析之PHP文件上传时,如何识别文件伪装? [修改]
回复 使用道具 举报
6666666666666666666666
回复 使用道具 举报
PHP文件上传时,如何识别文件伪装?
回复 使用道具 举报
防盗链技术防盗链技术
回复 使用道具 举报
支持一下
回复 使用道具 举报
啦啦啦啦啦啦啦啦啦了了
回复 使用道具 举报
测试一下,验证码那个,是一个库吗?
回复 使用道具 举报
1111111111111111111111
回复 使用道具 举报
这么多方法!!!
回复 使用道具 举报
HiHMH 初级黑马 2017-4-17 16:41:31
19#
好!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
回复 使用道具 举报
123123123123
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马