利用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对象类型判断
Aug 27 PHP
php visitFile()遍历指定文件夹函数
Aug 21 PHP
探讨php中header的用法详解
Jun 07 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
查找php配置文件php.ini所在路径的二种方法
May 26 PHP
php在数组中查找指定值的方法
Mar 17 PHP
PHP加密解密实例分析
Dec 25 PHP
ThinkPHP框架里隐藏index.php
Apr 12 PHP
zen cart实现订单中增加paypal中预留电话的方法
Jul 12 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 PHP
PHP面向对象中new self()与 new static()的区别浅析
Aug 17 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 class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
destoon数据库表说明汇总
2014/07/15 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
javascript dom 基本操作小结
2010/04/11 Javascript
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
使用jQuery如何写一个含验证码的登录界面
2019/05/13 jQuery
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
python实现SMTP邮件发送功能
2020/06/16 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
Python标准库之collections包的使用教程
2017/04/27 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
数控专业应届生求职信
2013/11/27 职场文书
医药营销个人求职信
2014/04/12 职场文书
法人委托书范本
2014/09/15 职场文书
普通党员个人整改措施
2014/10/27 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
电影圆明园观后感
2015/06/03 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android