php检测图片木马多进制编程实践


Posted in PHP onApril 11, 2013

前不久,我申请加入了某开源组织,他们要我写一个功能用来检测图片中是否有木马脚本。
其实一开始我什么也不知道,只是后来在网上查了一些资料,找到的全是有制作图片木马的教程,并没有找到检测的程序。

经过几番思索之后,决定从制作原理来分析这种木马程序。这种木马程序是十六进制编码写的,我灵机一动,写了以下这个上传类。最终通过了组织测验。呵呵

现在把它拿出来给大家分享,有什么不好的地方,还请指正! anyon@139.com;

<?php 
/** 
+------------------------------------------------------------------------------ 
* Upload 文件上传类 
+------------------------------------------------------------------------------ 
* @package Upload 
* @author Anyon <Anyon@139.com> 
* @version $Id: Upload.class.php 2013-3-20 21:47:23 Anyon $ 
+------------------------------------------------------------------------------ 
*/ 
class Upload { 
private static $image = null; 
private static $status = 0; 
private static $suffix = null; 
private static $imageType = array('.jpg', '.bmp','.gif','.png'); 
private static $message = array( 
'0' => '没有错误发生,文件上传成功。', 
'1' => '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。', 
'2' => '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。', 
'3' => '文件只有部分被上传。', 
'4' => '没有文件上传。', 
'5' => '未能通过安全检查的文件。', 
'6' => '找不到临时文件夹。', 
'7' => '文件写入失败。', 
'8' => '文件类型不支持', 
'9' => '上传的临时文件丢失。', 
); 
//@ 开始执行文件上传 
public static function start($feild = 'file') { 
if (!empty($_FILES)) { 
self::$status = $_FILES[$feild]['error']; 
if (self::$status > 0) 
return array('status' => self::$status, 'msg' => self::$message[self::$status]); 
self::$image = $_FILES[$feild]['tmp_name']; 
self::$suffix = strtolower(strrchr($_FILES[$feild]['name'], '.')); 
return array('status' => self::_upload(), 'path' => self::$image, 'msg' => self::$message[self::$status]); 
} else { 
return array('status' => self::$status, 'msg' => self::$message[self::$status]); 
} 
} 
//@ 私有 上传开始 
private static function _upload($path = './upload/') { 
date_default_timezone_set('PRC'); 
$newFile = $path . date('Y/m/d/His') . rand(100, 999) . self::$suffix; 
self::umkdir(dirname($newFile)); 
if (is_uploaded_file(self::$image) && move_uploaded_file(self::$image, $newFile)) { 
self::$image = $newFile; 
if (in_array(self::$suffix, self::$imageType)) 
return self::checkHex(); 
else 
return self::$status = 0; 
} else { 
return self::$status = 9; 
} 
} 
//@ 私有 16进制检测 
private static function checkHex() { 
if (file_exists(self::$image)) { 
$resource = fopen(self::$image, 'rb'); 
$fileSize = filesize(self::$image); 
fseek($resource, 0); 
if ($fileSize > 512) { // 取头和尾 
$hexCode = bin2hex(fread($resource, 512)); 
fseek($resource, $fileSize - 512); 
$hexCode .= bin2hex(fread($resource, 512)); 
} else { // 取全部 
$hexCode = bin2hex(fread($resource, $fileSize)); 
} 
fclose($resource); 
/* 匹配16进制中的 <% ( ) %> */ 
/* 匹配16进制中的 <? ( ) ?> */ 
/* 匹配16进制中的 <script | /script> 大小写亦可*/ 
if (preg_match("/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3C534352495054)|(2F5343524950543E)|(3C736372697074)|(2F7363726970743E)/is", $hexCode)) 
self::$status = 5; 
else 
self::$status = 0; 
return self::$status; 
} else { 
return self::$status = 9; 
} 
} 
//@ 私有 创建目录 
private static function umkdir($dir) { 
if (!file_exists($dir) && !is_dir($dir)) { 
self::umkdir(dirname($dir)); 
@mkdir($dir); 
} 
} 
}
PHP 相关文章推荐
深入理解php的MySQL连接类
Jun 07 PHP
Yii 快速,安全,专业的PHP框架
Sep 03 PHP
Yii框架登录流程分析
Dec 03 PHP
PHP实现批量修改文件后缀名的方法
Jul 30 PHP
PHP中Http协议post请求参数
Nov 02 PHP
PHP数组去重比较快的实现方式
Jan 19 PHP
Symfony2安装的方法(2种方法)
Feb 04 PHP
PHP模拟post提交数据方法汇总
Feb 16 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
May 18 PHP
thinkphp中的url跳转用法分析
Jul 12 PHP
PHP文件上传操作实例详解
Sep 27 PHP
PHP简单实现循环链表功能示例
Nov 10 PHP
谈谈关于php的优点与缺点
Apr 11 #PHP
如何用PHP实现插入排序?
Apr 10 #PHP
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 #PHP
克隆一个新项目的快捷方式
Apr 10 #PHP
str_replace只替换一次字符串的方法
Apr 09 #PHP
apache和php之间协同工作的配置经验分享
Apr 08 #PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
Apr 08 #PHP
You might like
php中变量及部分适用方法
2008/03/27 PHP
php下统计用户在线时间的一种尝试
2010/08/26 PHP
PHP新手NOTICE错误常见解决方法
2011/12/07 PHP
分享一个PHP数据流应用的简单例子
2012/06/01 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
PHP请求远程地址设置超时时间的解决方法
2016/10/29 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
js form action动态修改方法
2008/11/04 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
python实现读取命令行参数的方法
2015/05/22 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
python多线程扫描端口(线程池)
2019/09/04 Python
Python print不能立即打印的解决方式
2020/02/19 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
Sony C++笔试题
2013/03/10 面试题
大学新生入学教育方案
2014/05/16 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题