利用PHP实现智能文件类型检测的实现代码


Posted in PHP onAugust 02, 2011

使用文件后缀和MIME类型检测
通常我们想严格限制文件类型的时候,可以简单地用$_FILES['myFile']['type']  取得文件的 MIME类型然后来检测它是否是合法的类型。
或者我们可以取文件名的最后几个字符来获取文件后缀,不幸的是,这些方法并不足够,可以很容易地改变文件的扩展名绕过这个限制。此外,MIME类型信息是由浏览器发送的,而且,对于大多数浏览器,即使不是全部,是根据文件的扩展名的来给出MIME类型信息的!因此,MIME类型,就像扩展名一样,可以很容易地欺骗。
使用“魔术字节”
确定文件类型的最佳方法是通过检查文件的前几个字节 ? 称为“魔字节”。魔术字节本质上是文件头中不同长度在2到40个字节之间的,或在文件末尾的签名。有上百个类型的文件,他们中相当多的文件类型有好几个文件签名与它们相关联。在这里你可以看到一个文件签名列表。
偷懒的办法是使用fileinfo扩展,PHP 5.3.0 默认是启用的(根据官方MANUAL),如果没有启用,你可以自己启用
如在windows下面:

extension=php_fileinfo.dll

linux下面:

extension=fileinfo.so 
#如不能正常工作,再加上下面这条 
#mime_magic.magicfile=/usr/share/file/magic

windows下面如不能正常工作:
可参考:http://www.php.net/manual/en/fileinfo.installation.php#82570
下载file-5.03-bin.zip ,解压出来,在其中的share目录有magic.mgc 、magic 两个文件。
然后添加一个名为MAGIC的系统环境变量指向magic 文件。如D:\software\PHP\extras\misc\magic  

function getFileMimeType($file) { 
$buffer = file_get_contents($file); 
$finfo = new finfo(FILEINFO_MIME_TYPE); 
return $finfo->buffer($buffer); 
} 
$mime_type = getFileMimeType($file); 
switch($mime_type) { 
case "image/jpeg": 
// your actions go here... 
}

处理图像上传
如果你打算只允许图像上传,那么你可以使用内置的getimagesize()函数,以确保用户实际上是上传一个有效的图像文件。如果该文件不是有效的图像文件,这个函数返回false。
// 假设file input 域的name 属性为myfile 
$tempFile = $_FILES['myFile']['tmp_name']; // path of the temp file created by PHP during upload 
$imginfo_array = getimagesize($tempFile); // returns a false if not a valid image file 
if ($imginfo_array !== false) { 
$mime_type = $imginfo_array['mime']; 
switch($mime_type) { 
case "image/jpeg": 
// your actions go here... 
} 
} 
else { 
echo "This is not a valid image file"; 
}

手动读取和解释“魔法字节”
如果由于某种原因,你不能安装FileInfo扩展,那么你仍然可以手动确定,通过读取文件的前几个字节,并比较它们与已知的魔法与特定文件类型相关联的字节的文件类型。这个过程肯定少许的试验和错误,因为还有一种可能,有少数非法的魔法字节与合法文件格式关联了。
然而这不是不可能的,几年前,我被要求做一个只允许真正的 mp3 文件上传的脚本文件,并且,当时我们不能用 Fileinfo, 我们只能依靠这种手动检测的方式了.
我花了一段时间来解析一些mp3文件的非法魔法字节,但很快,我得到了一个稳定的上传脚本。
在本文结束前,我想给大家一个警告: 确保你永远没有调用一个 include() 来包含一个上传的文件,因为PHP代码很可能会巧妙地隐藏在图片里面,并且图片也可以成功的通过你的文件检测,当这样的脚本运行时,只可能给系统带来破坏。
译自:http://designshack.co.uk/articles/php-articles/smart-file-type-detection-using-php/
PHP 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
php数组删除元素示例
Mar 21 PHP
理解PHP中的stdClass类
Apr 18 PHP
ci检测是ajax还是页面post提交数据的方法
Nov 10 PHP
php面象对象数据库操作类实例
Dec 02 PHP
php操作xml入门之xml标签的属性分析
Jan 23 PHP
php、java、android、ios通用的3des方法(推荐)
Sep 09 PHP
php 数组元素快速去重
May 05 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
PHP ADODB生成下拉列表框功能示例
May 29 PHP
PHP unset函数原理及使用方法解析
Aug 14 PHP
10条PHP高级技巧[修正版]
Aug 02 #PHP
PHP获取url的函数代码
Aug 02 #PHP
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 #PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
Aug 02 #PHP
linux下使用ThinkPHP需要注意大小写导致的问题
Aug 02 #PHP
理解和运用PHP中的多态性[译]
Aug 02 #PHP
应用开发中涉及到的css和php笔记分享
Aug 02 #PHP
You might like
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
浅谈PHP中的数据传输CURL
2016/09/06 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
autoIMG 基于jquery的图片自适应插件代码
2011/03/12 Javascript
jQuery LigerUI 使用教程表格篇(1)
2012/01/18 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
[02:10]DOTA2 TI10勇士令状玩法及不朽Ⅰ展示:焕新世界,如你所期
2020/05/29 DOTA
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
python logging日志模块的详解
2017/10/29 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
介绍一下except的用法和作用
2015/01/22 面试题
个人现实表现材料
2014/02/04 职场文书
物控部经理职务说明书
2014/02/25 职场文书
高考寄语大全
2014/04/08 职场文书
建筑工地标语
2014/06/18 职场文书
学校政风行风整改方案
2014/10/25 职场文书
优秀团队申报材料
2014/12/26 职场文书
在Python 中将类对象序列化为JSON
2022/04/06 Python