利用PHP实现智能文件类型检测的实现代码

2015-01-24信息快讯网

通常我们想严格限制文件类型的时候,可以简单地用$_FILES['myFile']['type']  取得文件的 MIME类型然后来检测它是否是合法的类型。

使用文件后缀和MIME类型检测
通常我们想严格限制文件类型的时候,可以简单地用$_FILES['myFile']['type']  取得文件的 MIME类型然后来检测它是否是合法的类型。
或者我们可以取文件名的最后几个字符来获取文件后缀,不幸的是,这些方法并不足够,可以很容易地改变文件的扩展名绕过这个限制。此外,MIME类型信息是由浏览器发送的,而且,对于大多数浏览器,即使不是全部,是根据文件的扩展名的来给出MIME类型信息的!因此,MIME类型,就像扩展名一样,可以很容易地欺骗。
使用“魔术字节”
确定文件类型的最佳方法是通过检查文件的前几个字节 C 称为“魔字节”。魔术字节本质上是文件头中不同长度在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中将html中的br换行符转换为文本输入中的换行符
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
自定义php类(查找/修改)xml文档
php中DOMElement操作xml文档实例演示
PHP 自定义错误处理函数trigger_error()
比较简单的百度网盘文件直链PHP代码
使用php判断浏览器的类型和语言的函数代码
CI框架源码阅读,系统常量文件constants.php的配置
phpadmin如何导入导出大数据文件及php.ini参数修改
PHP 获取文件路径(灵活应用__FILE__)
php中设置index.php文件为只读的方法
php中根据变量的类型 选择echo或dump
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
PHP 基于文件头的文件类型验证类函数
PHP 第二节 数据类型之转换
PHP5 的对象赋值机制介绍
10条PHP高级技巧[修正版]
PHP获取url的函数代码
给初学者的30条PHP最佳实践(荒野无灯)
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
linux下使用ThinkPHP需要注意大小写导致的问题
php XPath对XML文件查找及修改实现代码
PHP文件上传后缀名与文件类型对照表整理
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
php中批量替换文件名的实现代码
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
php header Content-Type类型小结
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
php学习之数据类型之间的转换介绍
PHP 八种基本的数据类型小结
php通过文件头检测文件类型通用代码类(zip,rar等)
php 上传文件类型判断函数(避免上传漏洞 )
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
©2014-2024 dbsqp.com