利用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 相关文章推荐
杏林同学录(四)
Oct 09 PHP
PHP分页显示制作详细讲解
Nov 19 PHP
php 时间计算问题小结
Jan 04 PHP
浅析php变量作用域的一些问题
Aug 08 PHP
php加速器eAccelerator的配置参数、API详解
May 05 PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 PHP
PHP文件缓存内容保存格式实例分析
Aug 20 PHP
解决nginx不支持thinkphp中pathinfo的问题
Jul 21 PHP
php array_slice 取出数组中的一段序列实例
Nov 04 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
Laravel框架中集成MongoDB和使用详解
Oct 17 PHP
PHP 超级全局变量相关总结
Jun 30 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
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
PHP学习笔记 (1) 环境配置与代码调试
2011/06/19 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
php的扩展写法总结
2019/05/14 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
jQuery代码优化 遍历篇
2011/11/01 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
Python数据结构之Array用法实例
2014/10/09 Python
探究Python中isalnum()方法的使用
2015/05/18 Python
详解django.contirb.auth-认证
2018/07/16 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
python的slice notation的特殊用法详解
2019/12/27 Python
购买大码女装:Lane Bryant
2016/09/07 全球购物
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
电气工程师岗位职责
2014/01/01 职场文书
会计顶岗实习心得
2014/01/25 职场文书
公司董事长岗位职责
2014/06/08 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
妈妈别哭观后感
2015/06/08 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS