前言

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

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. 动画 Interpolator
  2. UIView翻译 (参考)
  3. input css年月日,input标签的type为date,显示的日期格式样式更改
  4. idea看更改过的代码_就是你把所有代码全写在一个类里的?
  5. 别慌,不就是跨域么!
  6. [转载]读史记札记26:容人岂皆有雅量
  7. 《西游记》中九尾狐狸为什么有太上老君的幌金绳?
  8. java多线程都有几种方式实现
  9. Leetcode 刷题笔记(二十二) ——贪心算法篇之进阶题目
  10. 忘记root密码,使用救援模式,grup设置密码
  11. PHP编写时的灵活性
  12. 如何在GitHub中上传图片-----简单易行,步骤超清晰
  13. Unity开发——CPU优化篇
  14. 网站渗透测试该怎么选择最便宜
  15. android 沙盒双开 微信,微信双开回来了,还不会被封号
  16. Python可视化matplotlib07-更靓的单颜色(二)
  17. 硬件工程师要学习的东西
  18. 数据库MySQL创库、创表基本命令
  19. Machine Learning | (1) Scikit-learn与特征工程
  20. Windows8安装Visual Studio 2012的方法

热门文章

  1. 小红书怎么买东西?有哪几个购买入口
  2. 华三服务器怎样用hdm安装linux,华三服务器HDM命令设置
  3. python预测药_Petuum 新研究助力临床决策:使用深度学习预测出院用药
  4. 虚拟现实创新应用实训室解决方案
  5. 安利2款绝美的壁纸软件,超好用!
  6. 多线程下的单例模式实现
  7. [Linux]nvidia optimus在linux下使用
  8. 【工具使用系列】文件格式转换工具Pandoc
  9. LeetCode(Python)—— x的平方根(简单)
  10. 教导,职业经理人最重要的能力