利用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中使用Sockets 从Usenet中获取文件
Jan 10 PHP
详解PHP显示MySQL数据的三种方法
Jun 05 PHP
PHP print类函数使用总结
Jun 25 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
php缓冲 output_buffering的使用详解
Jun 13 PHP
详解PHP的Yii框架中日志的相关配置及使用
Dec 08 PHP
简单谈谈PHP中的trait
Feb 25 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
Apr 18 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
PHP递归实现快速排序的方法示例
Dec 18 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 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
php4的彩蛋
2006/10/09 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
php和html的区别点详细总结
2019/09/24 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
浅析jQuery对select操作小结(遍历option,操作option)
2013/07/04 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
轻松掌握JavaScript状态模式
2016/09/07 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
python中引用与复制用法实例分析
2015/06/04 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
Python3 元组tuple入门基础
2020/02/09 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
简单叙述一下MYSQL的优化
2016/05/09 面试题
《日月潭》教学反思
2014/02/28 职场文书
《分一分》教学反思
2014/04/13 职场文书
技术负责人任命书
2014/06/05 职场文书
社区服务标语
2014/07/01 职场文书
迎新生晚会主持词
2015/06/30 职场文书