利用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动态生成虚拟现实VRML网页
Oct 09 PHP
实用函数10
Nov 08 PHP
PHP简单系统查询模块代码打包下载
Jun 07 PHP
PHP注释实例技巧
Oct 03 PHP
实用PHP会员权限控制实现原理分析
May 29 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
Jun 05 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
Jul 28 PHP
PHP中strtr字符串替换用法详解
Nov 26 PHP
php微信公众号开发模式详解
Nov 28 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
Jan 15 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
Sep 23 PHP
PHP 代码简洁之道(小结)
Oct 16 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 5.3新特性命名空间规则解析及高级功能
2010/03/11 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
Extjs入门之动态加载树代码
2010/04/09 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
JS仿JQuery选择器功能
2017/03/08 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
Python的Flask框架中web表单的教程
2015/04/20 Python
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
Python正则表达式经典入门教程
2017/05/22 Python
Python批量查询域名是否被注册过
2017/06/21 Python
python执行使用shell命令方法分享
2017/11/08 Python
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
搞笑车尾标语
2014/06/23 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
政府班子四风问题整改措施思想汇报
2014/10/08 职场文书
实习证明格式范文
2014/10/14 职场文书
警告通知
2015/04/25 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
转学证明范本
2015/06/19 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
golang 实现Location跳转方式
2021/05/02 Golang
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python