前言

介绍一种比较高端检测上传文件类型的方法,可以防止后缀名修改等低端的检测错误,有耐心的同学可以参考一下,我会封装成类供调用

MIME类型

在把输出结果传送到浏览器上的时候,浏览器必须启动适当的应用程序来处理这个输出文档。这可以通过多种类型MIME(multipurpose internet mail extensions)来完成。在http中,MIME类型被定义在content-type header中。
例如,如果客户端上传一个excel文件到服务器上,那么这是的mime类型就是“application/vnd.ms-excel”。在php中,可以通过$_FILE["type"]获得上传文件类型。
最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户端解释为HTML文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。
每个MIME类型由两部分组成,前面是数据的大类别,后面定义具体的种类。(具体可以查询mime类型表)

文件检测弊端

  • 文件扩展名检测漏洞(ps:文件扩展名可以被任意伪造)
  • 文件MIME类型判断不能使用$_FILES['userfile']['type'](ps:根据PHP官方的文档说明,该值完全可以被伪造!黑客只需修改浏览器的post请求头即可绕过这段代码检查,进而上传任意类型的文件!)

检测方法(针对excel)

  • 通过文件扩展名判断是03的excel文件还是07的excel文件
  • 根据不同的文件,获取不同文件的二进制数据,和file_signature进行对比,我截了03和07的excel的二进制数据图,大家可以参考一下,工具是madedit
  • 03的excel
  • 07的excel(07可以参考zip检测)

检测程序

    /*** Detect upload file type* * @param array $file         * @return bool $flag*/private function detectUploadFileMIME($file) {// 1.through the file extension judgement 03 or 07$flag = 0;$file_array = explode ( ".", $file ["name"] );$file_extension = strtolower ( array_pop ( $file_array ) );// 2.through the binary content to detect the fileswitch ($file_extension) {case "xls" :// 2003 excel$fh = fopen ( $file ["tmp_name"], "rb" );$bin = fread ( $fh, 8 );fclose ( $fh );$strinfo = @unpack ( "C8chars", $bin );$typecode = "";foreach ( $strinfo as $num ) {$typecode .= dechex ( $num );}if ($typecode == "d0cf11e0a1b11ae1") {$flag = 1;}break;case "xlsx" :// 2007 excel$fh = fopen ( $file ["tmp_name"], "rb" );$bin = fread ( $fh, 4 );fclose ( $fh );$strinfo = @unpack ( "C4chars", $bin );$typecode = "";foreach ( $strinfo as $num ) {$typecode .= dechex ( $num );}echo $typecode;if ($typecode == "504b34") {$flag = 1;}break;}// 3.return the flagreturn $flag;}

参考链接

文件类型对照表

php检测上传excel文件类型相关推荐

  1. php上传查询excel到mysql_PHP上传Excel文件导入数据到MySQL数据库示例

    PHP上传Excel文件导入数据到MySQL数据库示例2020-06-20 00:34:11 最近在做Excel文件导入数据到数据库.网站如果想支持批量插入数据,可以制作一个上传Excel文件,导入里 ...

  2. php 上传excel到mysql_PHP上传Excel文件导入数据到MySQL数据库示例

    最近在做Excel文件导入数据到数据库.网站如果想支持批量插入数据,可以制作一个上传Excel文件,导入里面的数据内容到MySQL数据库的小程序. 要用到的工具: ThinkPHP:轻量级国产PHP开 ...

  3. vue之 上传 excel文件

    目录 vue之 上传 excel文件 父组件 UploadExcel.vue 效果 vue之 上传 excel文件 父组件 <upload-excel-component :on-success ...

  4. 实现web前端上传excel文件到flask服务器

    这里有两种方法:1. html方式:2. javascript方式(jQuery+ajax) 第1种方法:html方式 这种方法直接通过设计form表单相关属性实现将excel表格上传到服务器,并在服 ...

  5. springboot实现上传Excel文件与数据库中的数据进行比对

    springboot实现上传Excel文件与数据库中的数据进行比对 首先先写好文件上传的接口,然后上传需要比对数据的文件,在点击数据比对 下面是一部分数据比对的代码: 后端controller部分: ...

  6. Django框架(上传Excel文件并读取)

    博主今天整理下Django框架中上传Excel文件并读取 博主是要在管理平台中新增用例的维护功能,想着通过上传Excel文件来展示用例,下面是项目的路径图: 首先先建数据库模型 model.py 可以 ...

  7. 2008下php上传文件崩溃,php – 当用户反复尝试上传无效文件类型时,网站崩溃

    我试图理解错误-- 我有一个允许用户上传CSV的网络应用程序.如果文件类型不是CSV,则不会发生任何操作,页面只显示"无效的文件类型". 如果用户尝试上载无效的文件类型并反复单击触 ...

  8. 服务器上传excel文件并读取数据,asp.net上传Excel文件并读取数据的实现方法

    前言 本文主要给大家介绍了关于asp.net上传Excel文件并读取数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 实现如下: 前台代码:使用服务端控件实现上传 服务端 ...

  9. php上传常见文件类型和$_FILES[file][type]

    php上传常见文件类型对应的$_FILES["file"]["type"]. xls application/vnd.ms-excel xlsx applica ...

最新文章

  1. 性能超越图神经网络,将标签传递和简单模型结合实现SOTA
  2. WEB前端性能优化小结
  3. 聊一聊:MyBatis和Spring Data JPA的选择问题
  4. GoldenGate for Java adapter介绍二(代码篇)
  5. CDN技术之--流媒体CDN系统的组成
  6. 通过curl获取网页访问时间
  7. 从outside对ASA防火墙身后ACS4.x进行管理测试
  8. 分页及页码导航 用户控件
  9. servlet过滤器(Filter)
  10. 机器视觉光源知识总结(二)
  11. 游戏夜读 | 游戏关卡设计师
  12. Manger配置同步任务
  13. 云计算实战应用案例精讲-【深度学习】多模态融合(论文篇三)
  14. HDU 6441(费马大定理+奇偶数列法)
  15. input 测试工具 --evtest
  16. Linux系统设置共享命令,Linux 基本命令操作 (文件共享) 一
  17. 使用机器人工具箱在matlab上进行六轴机器人(6R)运动学建模【个人简记】
  18. 静息态fMRI状态依赖的有效连接
  19. Appium H5自动化测试
  20. chm打开秒退_CHM文件打开方式

热门文章

  1. Switch基本配置
  2. Ogre动作融合(转)
  3. MySQL大表分页查询优化技巧
  4. 回收站清空后还能找回文件吗?回收站清空了怎么恢复
  5. Markdown编辑器使用说明
  6. 从volatile关键字到总线风暴
  7. 如何用计算机算10的-5次方,在excel中如何计算10的几次方呢
  8. 10000m3d城镇生活污水处理工艺设计
  9. Git和SVN的区别及Git的使用
  10. 爬取18年二季度天天基金网基金持仓信息-python【转发】