PHP 基于文件头的文件类型验证类函数


Posted in PHP onMay 01, 2012

我这里写了一个验证类,是通过文件头来判断文件格式.(也不是百分之百安全,如果用户伪造了文件头,也能通过验证)

<?php 
/** 
* 检证文件类型类 
* 
* @author Silver 
*/ 
class FileTypeValidation 
{ 
// 文件类型,不同的头信息 
private static $_fileFormats = Array( 
'jp2' => '0000000C6A502020',<br/> '3gp' => '0000002066747970', 
'3gp5' => '0000001866747970', 
'm4a' => '00000020667479704D3441', 
'ico' => '00000100', 
'spl' => '00000100', 
'vob' => '000001BA', 
'cur' => '00000200', 
'wb2' => '00000200', 
'wk1' => '0000020006040600', 
'wk3' => '00001A0000100400', 
'wk4' => '00001A0002100400', 
'wk5' => '00001A0002100400', 
'123' => '00001A00051004', 
'qxd' => '00004D4D585052', 
'mdf' => '010F0000', 
'tr1' => '0110', 
'rgb' => '01DA01010003', 
'drw' => '07', 
'dss' => '02647373', 
'dat' => 'A90D000000000000', 
'db3' => '03', 
'qph' => '03000000', 
'adx' => '80000020031204', 
'db4' => '04', 
'n' => 'FFFE0000', 
'a' => 'FFFE0000', 
'skf' => '07534B46', 
'dtd' => '0764743264647464', 
'db' => 'D0CF11E0A1B11AE1', 
'pcx' => '0A050101', 
'mp' => '0CED', 
'doc' => 'D0CF11E0A1B11AE1', 
'nri' => '0E4E65726F49534F', 
'wks' => 'FF00020004040554', 
'pf' => '1100000053434341', 
'ntf' => '4E49544630', 
'nsf' => '4E45534D1A01', 
'arc' => '41724301', 
'pak' => '5041434B', 
'eth' => '1A350100', 
'mkv' => '1A45DFA393428288', 
'ws' => '1D7D', 
'gz' => '1F8B08', 
'tar.z' => '1FA0', 
'ain' => '2112', 
'lib' => '213C617263683E0A', 
'msi' => 'D0CF11E0A1B11AE1', 
'vmdk' => '4B444D', 
'dsp' => '23204D6963726F73', 
'amr' => '2321414D52', 
'hdr' => '49536328', 
'sav' => '24464C3240282329', 
'eps' => 'C5D0D3C6', 
'pdf' => '25504446', 
'fdf' => '25504446', 
'hqx' => '2854686973206669', 
'log' => '2A2A2A2020496E73', 
'ivr' => '2E524543', 
'rm' => '2E524D46', 
'rmvb' => '2E524D46', 
'ra' => '2E7261FD00', 
'au' => '646E732E', 
'cat' => '30', 
'evt' => '300000004C664C65', 
'asf' => '3026B2758E66CF11', 
'wma' => '3026B2758E66CF11', 
'wmv' => '3026B2758E66CF11', 
'wri' => 'BE000000AB', 
'7z' => '377ABCAF271C', 
'psd' => '38425053', 
'sle' => '414376', 
'asx' => '3C', 
'xdr' => '3C', 
'dci' => '3C21646F63747970', 
'manifest' => '3C3F786D6C2076657273696F6E3D', 
'xml' => '3C3F786D6C2076657273696F6E3D22312E30223F3E', 
'msc' => 'D0CF11E0A1B11AE1', 
'fm' => '3C4D616B65724669', 
'mif' => '56657273696F6E20', 
'gid' => '4C4E0200', 
'hlp' => '4C4E0200', 
'dwg' => '41433130', 
'syw' => '414D594F', 
'abi' => '414F4C494E444558', 
'aby' => '414F4C4442', 
'bag' => '414F4C2046656564', 
'idx' => '5000000020000000', 
'ind' => '414F4C494458', 
'pfc' => '414F4C564D313030', 
'org' => '414F4C564D313030', 
'vcf' => '424547494E3A5643', 
'bin' => '424C4932323351', 
'bmp' => '424D', 
'dib' => '424D', 
'prc' => '424F4F4B4D4F4249', 
'bz2' => '425A68', 
'tar.bz2' => '425A68', 
'tbz2' => '425A68', 
'tb2' => '425A68', 
'rtd' => '43232B44A4434DA5', 
'cbd' => '434246494C45', 
'iso' => '4344303031', 
'clb' => '434F4D2B', 
'cpt' => '43505446494C45', 
'cru' => '43525553482076', 
'swf' => '465753', 
'ctf' => '436174616C6F6720', 
'dms' => '444D5321', 
'adf' => '5245564E554D3A2C', 
'dvr' => '445644', 
'ifo' => '445644', 
'cdr' => '52494646', 
'vcd' => '454E545259564344', 
'mdi' => '4550', 
'e01' => '4C5646090D0AFF00', 
'evtx' => '456C6646696C6500', 
'qbb' => '458600000600', 
'cpe' => '464158434F564552', 
'flv' => '464C56', 
'aiff' => '464F524D00', 
'eml' => '582D', 
'gif' => '47494638', 
'pat' => '47504154', 
'gx2' => '475832', 
'sh3' => '4848474231', 
'tif' => '4D4D002B', 
'tiff' => '4D4D002B', 
'mp3' => '494433', 
'koz' => '49443303000000', 
'crw' => '49491A0000004845', 
'cab' => '4D534346', 
'lit' => '49544F4C49544C53', 
'chi' => '49545346', 
'chm' => '49545346', 
'jar' => '5F27A889', 
'jg' => '4A47040E000000', 
'kgb' => '4B47425F61726368', 
'shd' => '68490000', 
'lnk' => '4C00000001140200', 
'obj' => '80', 
'pdb' => 'ACED000573720012', 
'mar' => '4D41723000', 
'dmp' => '504147454455', 
'hdmp' => '4D444D5093A7', 
'mls' => '4D563243', 
'mmf' => '4D4D4D440000', 
'nvram' => '4D52564E', 
'ppz' => '4D534346', 
'snp' => '4D534346', 
'tlb' => '4D53465402000100', 
'dvf' => '4D535F564F494345', 
'msv' => '4D535F564F494345', 
'mid' => '4D546864', 
'midi' => '4D546864', 
'dsn' => '4D56', 
'com' => 'EB', 
'dll' => '4D5A', 
'drv' => '4D5A', 
'exe' => '4D5A', 
'pif' => '4D5A', 
'qts' => '4D5A', 
'qtx' => '4D5A', 
'sys' => 'FFFFFFFF', 
'acm' => '4D5A', 
'ax' => '4D5A900003000000', 
'cpl' => 'DCDC', 
'fon' => '4D5A', 
'ocx' => '4D5A', 
'olb' => '4D5A', 
'scr' => '4D5A', 
'vbx' => '4D5A', 
'vxd' => '4D5A', 
'386' => '4D5A', 
'api' => '4D5A900003000000', 
'flt' => '76323030332E3130', 
'zap' => '4D5A90000300000004000000FFFF', 
'sln' => '4D6963726F736F66742056697375616C', 
'jnt' => '4E422A00', 
'jtp' => '4E422A00', 
'cod' => '4E616D653A20', 
'dbf' => '4F504C4461746162', 
'oga' => '4F67675300020000', 
'ogg' => '4F67675300020000', 
'ogv' => '4F67675300020000', 
'ogx' => '4F67675300020000', 
'dw4' => '4F7B', 
'pgm' => '50350A', 
'pax' => '504158', 
'pgd' => '504750644D41494E', 
'img' => 'EB3C902A', 
'zip' => '504B0304140000', 
'docx' => '504B030414000600', 
'pptx' => '504B030414000600', 
'xlsx' => '504B030414000600', 
'kwd' => '504B0304', 
'odt' => '504B0304', 
'odp' => '504B0304', 
'ott' => '504B0304', 
'sxc' => '504B0304', 
'sxd' => '504B0304', 
'sxi' => '504B0304', 
'sxw' => '504B0304', 
'wmz' => '504B0304', 
'xpi' => '504B0304', 
'xps' => '504B0304', 
'xpt' => '5850434F4D0A5479', 
'grp' => '504D4343', 
'qemu' => '514649', 
'abd' => '5157205665722E20', 
'qsd' => '5157205665722E20', 
'reg' => 'FFFE', 
'sud' => '52454745444954', 
'ani' => '52494646', 
'cmx' => '52494646', 
'ds4' => '52494646', 
'4xm' => '52494646', 
'avi' => '52494646', 
'cda' => '52494646', 
'qcp' => '52494646', 
'rmi' => '52494646', 
'wav' => '52494646', 
'cap' => '58435000', 
'rar' => '526172211A0700', 
'ast' => '5343486C', 
'shw' => '53484F57', 
'cpi' => 'FF464F4E54', 
'sit' => '5374756666497420', 
'sdr' => '534D415254445257', 
'cnv' => '53514C4F434F4E56', 
'cal' => 'B5A2B0B3B3B0A5B5', 
'info' => 'E310000100000000', 
'uce' => '55434558', 
'ufa' => '554641C6D2C1', 
'pch' => '564350434830', 
'ctl' => '56455253494F4E20', 
'ws2' => '575332303030', 
'lwp' => '576F726450726F', 
'bdr' => '5854', 
'zoo' => '5A4F4F20', 
'ecf' => '5B47656E6572616C', 
'vcw' => '5B4D535643', 
'dun' => '5B50686F6E655D', 
'sam' => '5B7665725D', 
'cpx' => '5B57696E646F7773', 
'cfg' => '5B666C7473696D2E', 
'cas' => '5F434153455F', 
'cbk' => '5F434153455F', 
'arj' => '60EA', 
'vhd' => '636F6E6563746978', 
'csh' => '6375736800000002', 
'p10' => '64000000', 
'dex' => '6465780A30303900', 
'dsw' => '64737766696C65', 
'flac' => '664C614300000022', 
'dbb' => '6C33336C', 
'acd' => '72696666', 
'ram' => '727473703A2F2F', 
'dmg' => '78', 
'lgc' => '7B0D0A6F20', 
'lgd' => '7B0D0A6F20', 
'pwi' => '7B5C707769', 
'rtf' => '7B5C72746631', 
'psp' => '7E424B00', 
'wab' => '9CCBCB8D1375D211', 
'wpf' => '81CDAB', 
'png' => '89504E470D0A1A0A', 
'aw' => '8A0109000000E108', 
'hap' => '91334846', 
'skr' => '9501', 
'gpg' => '99', 
'pkr' => '9901', 
'qdf' => 'AC9EBD8F0000', 
'pwl' => 'E3828596', 
'dcx' => 'B168DE3A', 
'tib' => 'B46E6844', 
'acs' => 'C3ABCDAB', 
'lbk' => 'C8007900', 
'class' => 'CAFEBABE', 
'dbx' => 'CFAD12FE', 
'dot' => 'D0CF11E0A1B11AE1', 
'pps' => 'D0CF11E0A1B11AE1', 
'ppt' => 'D0CF11E0A1B11AE1', 
'xla' => 'D0CF11E0A1B11AE1', 
'xls' => 'D0CF11E0A1B11AE1', 
'wiz' => 'D0CF11E0A1B11AE1', 
'ac_' => 'D0CF11E0A1B11AE1', 
'adp' => 'D0CF11E0A1B11AE1', 
'apr' => 'D0CF11E0A1B11AE1', 
'mtw' => 'D0CF11E0A1B11AE1', 
'opt' => 'D0CF11E0A1B11AE1', 
'pub' => 'D0CF11E0A1B11AE1', 
'rvt' => 'D0CF11E0A1B11AE1', 
'sou' => 'D0CF11E0A1B11AE1', 
'spo' => 'D0CF11E0A1B11AE1', 
'vsd' => 'D0CF11E0A1B11AE1', 
'wps' => 'D0CF11E0A1B11AE1', 
'ftr' => 'D20A0000', 
'arl' => 'D42A', 
'aut' => 'D42A', 
'wmf' => 'D7CDC69A', 
'efx' => 'DCFE', 
'one' => 'E4525C7B8CD8A74D', 
'rpm' => 'EDABEEDB', 
'gho' => 'FEEF', 
'ghs' => 'FEEF', 
'wp' => 'FF575043', 
'wpd' => 'FF575043', 
'wpg' => 'FF575043', 
'wpp' => 'FF575043', 
'wp5' => 'FF575043', 
'wp6' => 'FF575043', 
'jfif' => 'FFD8FF', 
'jpe' => 'FFD8FF', 
'jpeg' => 'FFD8FF', 
'jpg' => 'FFD8FF', 
'mof' => 'FFFE23006C006900', 
'ipa' => '504B03040A', 
); 
/** 
* 检查文件类型 
* 
* @param string $filePath 文件路径 
* @param string $fileExt 文件扩展名 
* 
* @return boolean 
*/ 
public static function validation($filePath, $fileExt) 
{ 
// 文件格式未知 
if (!isset(self::$_fileFormats[$fileExt])) 
{ 
return false; 
} 
$length = strlen(self::$_fileFormats[$fileExt]); 
$bin = self::_readFile($filePath, $length); 
$fileHead = @unpack("H{$length}", $bin); 
// 判断文件头 
if (strtolower(self::$_fileFormats[$fileExt]) == $fileHead[1]) 
{ 
return true; 
} 
return false; 
} 
/** 
* 读取文件内容 
* 
* @param string $filePath 文件路径 
* @param integer $size 
* 
* @return string 
*/ 
private function _readFile($filePath, $size) 
{ 
$file = fopen($filePath, "rb"); 
$bin = fread($file, $size); 
fclose($file); 
return $bin; 
} 
} 
?>

调用
require './class_filetypevalidation.php'; 
// 文件路径 
$filePath = "D:/test.png"; 
$x = FileTypeValidation::validation($filePath, 'zip'); 
var_dump($x);
PHP 相关文章推荐
php桌面中心(二) 数据库写入
Mar 11 PHP
php xfocus防注入资料
Apr 27 PHP
php strtotime 函数UNIX时间戳
Jan 14 PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 PHP
php实现的DateDiff和DateAdd时间函数代码分享
Aug 16 PHP
php使用指定字符列表生成随机字符串的方法
Apr 18 PHP
Zend Framework创建自己的动作助手详解
Mar 05 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
Nov 09 PHP
php中strlen和mb_strlen用法实例分析
Nov 12 PHP
PHP面向对象程序设计组合模式与装饰模式详解
Dec 02 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
tp5修改(实现即点即改)
Oct 18 PHP
PHP 第三节 变量介绍
Apr 28 #PHP
PHP 第二节 数据类型之转换
Apr 28 #PHP
PHP 第二节 数据类型之数组
Apr 28 #PHP
PHP 第二节 数据类型之字符串类型
Apr 28 #PHP
PHP 第二节 数据类型之数值型
Apr 28 #PHP
PHP 第一节 php简介
Apr 28 #PHP
PHP原生模板引擎 最简单的模板引擎
Apr 25 #PHP
You might like
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
php支付宝接口用法分析
2015/01/04 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
浅谈javascript的调试
2015/01/28 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
Sanic框架基于类的视图用法示例
2018/07/18 Python
详解python的argpare和click模块小结
2019/03/31 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
Python版中国省市经纬度
2020/02/11 Python
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
模具数控专业自荐信
2014/01/27 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
基层党员对照检查材料
2014/09/24 职场文书
小学教师见习总结
2015/06/23 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python