利用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 相关文章推荐
php 生成文字png图片的代码
Apr 17 PHP
Linux下php5.4启动脚本
Aug 03 PHP
PHP中的命名空间相关概念浅析
Jan 22 PHP
php生成图片验证码的实例讲解
Aug 03 PHP
php验证码生成代码
Nov 11 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
Nov 23 PHP
PHP获取文件扩展名的4种方法
Nov 24 PHP
关于php几种字符串连接的效率比较(详解)
Feb 22 PHP
PHP数组遍历的几种常见方式总结
Feb 15 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
Sep 30 PHP
php去除deprecated的实例方法
Nov 17 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
Jquery解析json数据详解
2013/12/26 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
2014/09/01 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
python自然语言编码转换模块codecs介绍
2015/04/08 Python
python对html代码进行escape编码的方法
2015/05/04 Python
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
python调用函数、类和文件操作简单实例总结
2019/11/29 Python
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
财务人员个人求职信范文
2013/12/04 职场文书
心理健康心得体会
2014/01/02 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
员工保密协议书
2014/09/27 职场文书
女生抽烟检讨书
2014/10/05 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
检讨书范文1000字
2015/01/28 职场文书
商业计划书之服装
2019/09/09 职场文书
创业计划书之面包店
2019/09/12 职场文书
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android
box-shadow单边阴影的实现
2023/05/21 HTML / CSS