黑马程序员技术交流社区

标题: 案例分析之PHP文件上传时,如何识别文件伪装? [打印本页]

作者: huawei    时间: 2016-12-17 21:39
标题: 案例分析之PHP文件上传时,如何识别文件伪装?
本帖最后由 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扩展。


精华推荐:

2017最新PHP学习路线图(附完整视频资源)+源码+技巧/经验+求职+前景总结!
连续两班仅6日就业率突破53%,看2016PHP课程升级是否成功!
视频集合:众多老学员呐喊:"为什么我选传智PHP"!
作者: 肖肖肖    时间: 2016-12-18 21:08
谢谢分享!!!
作者: 290422624    时间: 2016-12-20 17:47
跟着大神打天下

作者: chen521    时间: 2016-12-21 08:53
http://bbs.itheima.com/thread-336282-1-1.html?mxhw
作者: php黑牛    时间: 2016-12-22 14:50
来学习学习
作者: hp_eckj_luox    时间: 2016-12-23 09:48
案例分析之PHP文件上传时,如何识别文件伪装?
作者: xiami23king    时间: 2017-1-17 09:58
6666666666666666666
作者: sunsine    时间: 2017-2-7 20:43
学习一下
作者: 1317181388    时间: 2017-2-10 01:28
感谢楼主分享
作者: sunshine1992    时间: 2017-2-10 11:48
RE: 案例分析之PHP文件上传时,如何识别文件伪装? [修改]
作者: xyz2017    时间: 2017-2-14 20:36
6666666666666666666666
作者: fjdaslfjk    时间: 2017-2-16 14:59
PHP文件上传时,如何识别文件伪装?
作者: 用户名不得小    时间: 2017-2-17 22:28
防盗链技术防盗链技术
作者: muyu123    时间: 2017-2-24 15:09
支持一下
作者: 神佑骑士    时间: 2017-3-6 17:23
测试一下,验证码那个,是一个库吗?
作者: Overflow    时间: 2017-3-12 16:49
1111111111111111111111
作者: zhang9648    时间: 2017-3-24 23:35
这么多方法!!!
作者: HiHMH    时间: 2017-4-17 16:41
好!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
作者: vcflyfeel    时间: 2017-4-26 13:01
123123123123
作者: worldtongf    时间: 2017-5-21 00:58
例分析之PHP文件上传时,如何识别文件伪装? [修改]
作者: 瞬间回忆    时间: 2017-5-24 17:25
案例分析之PHP文件上传时,如何识别文件伪装?
作者: rebirthday    时间: 2017-5-31 10:03
谢谢楼主的分享
作者: snackstops    时间: 2017-6-22 14:36
学习学习
学习
学习


作者: 961900940    时间: 2017-7-4 23:11
111111111111111
作者: 山与暮歌    时间: 2017-8-14 15:28
$_FILES["file"]["name"]
作者: 姜百虎    时间: 2017-8-28 22:08
好文章,值得推荐
作者: cgl    时间: 2017-9-8 04:05
....rwjwjrwrj;rwrwr
作者: yuanlinjiayou    时间: 2017-9-10 12:11
1111111111111111
作者: Rakishly    时间: 2017-9-20 23:13
案例分析之PHP文件上传时
作者: 蜗牛泛泛    时间: 2017-9-26 14:47
55555555555555555
作者: yinkuang    时间: 2017-9-27 12:13
不错,正找这个呢
作者: 12580    时间: 2018-5-17 00:57
1sfsfsdfsadfsdfsdfsdfsd
作者: yuyongting2001    时间: 2018-7-6 00:23
通过技术手段来进行处理,一旦检测到来源不是本站即
作者: uuuqqq    时间: 2018-10-7 08:13
有没搞错这还要隐藏啊!!!!

作者: june01    时间: 2018-12-31 10:47
1111111111111111111111
作者: bug刘    时间: 2019-1-22 16:29
学习学习
作者: manyi2009    时间: 2019-3-1 10:34
感谢分享
作者: 1024316664    时间: 2019-3-15 16:22
学习血虚
作者: ksqbhmcxy    时间: 2019-11-23 10:30
1111111111111111111
作者: mgwzfxd    时间: 2020-6-29 16:33
此资源获取文件mime类型和编
作者: 啦啦哈啦啦    时间: 2021-5-26 16:48
感谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2