利用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入门
Oct 09 PHP
介绍几个array库的新函数 php
Dec 29 PHP
安装APACHE
Jan 15 PHP
php array_slice函数的使用以及参数详解
Aug 30 PHP
php中数字0和空值的区别分析
Jun 05 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 PHP
php操作redis缓存方法分享
Jun 03 PHP
PHP基于MySQL数据库实现对象持久层的方法
Jun 17 PHP
php实现可运算的验证码
Nov 10 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
php-msf源码详解
Dec 25 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
Apr 06 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实现事件监听与触发的方法
2014/11/21 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python使用urllib2提交http post请求的方法
2015/05/26 Python
python中OrderedDict的使用方法详解
2017/05/05 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
Python实现FLV视频拼接功能
2020/01/21 Python
opencv python如何实现图像二值化
2020/02/03 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
公务员转正考察材料
2014/02/07 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
个人授权委托书样本
2014/09/13 职场文书
2014年实习生工作总结
2014/11/27 职场文书
逃课检讨书范文
2015/05/06 职场文书
职工宿舍管理制度
2015/08/05 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript