利用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+oracle 分页类
Oct 09 PHP
简单的用PHP编写的导航条程序
Oct 09 PHP
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
php2html php生成静态页函数
Dec 08 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 PHP
深入PHP变量存储的详解
Jun 13 PHP
php获取当前时间的毫秒数的方法
Jan 26 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
Mar 05 PHP
php接口技术实例详解
Dec 07 PHP
php中this关键字用法分析
Dec 07 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 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
smarty的保留变量问题
2008/10/23 PHP
php 各种应用乱码问题的解决方法
2010/05/09 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
[原创]来自ImageSee官方 JavaScript图片浏览器
2008/01/16 Javascript
js switch case default 的用法示例介绍
2013/10/23 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
python ip正则式
2009/05/07 Python
python文件写入实例分析
2015/04/08 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
python 画图 图例自由定义方式
2020/04/17 Python
python如何写个俄罗斯方块
2020/11/06 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
生日宴会答谢词
2014/01/09 职场文书
员工培训邀请函
2014/02/02 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
匿名信格式范文
2015/05/27 职场文书
士兵突击观后感
2015/06/16 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书
python 命令行传参方法总结
2021/05/25 Python
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang