利用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 相关文章推荐
用Socket发送电子邮件(利用需要验证的SMTP服务器)
Oct 09 PHP
很好用的PHP数据库类
May 27 PHP
PHP加速 eAccelerator配置和使用指南
Jun 05 PHP
PHP设计模式之代理模式的深入解析
Jun 13 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
Jun 21 PHP
win7下memCache的安装过程(具体操作步骤)
Jun 28 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 PHP
php时区转换转换函数
Jan 07 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
PHP会话控制实例分析
Dec 24 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
Mar 16 PHP
PHPExcel实现的读取多工作表操作示例
Apr 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 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
JS代码防止SQL注入的方法(超简单)
2016/04/12 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
vue路由跳转时判断用户是否登录功能的实现
2017/10/26 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
初步解析Python下的多进程编程
2015/04/28 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
国际商务专业学生个人的自我评价
2013/09/28 职场文书
给儿子的表扬信
2014/01/15 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
关于成绩下滑的自我检讨书
2014/09/20 职场文书
大学生见习报告范文
2014/11/03 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
捐资助学感谢信
2015/01/21 职场文书
政工师工作总结2015
2015/05/26 职场文书
外出培训学习心得体会
2016/01/18 职场文书
2019学子的答谢词范本!
2019/07/05 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python