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 相关文章推荐
其他功能
Oct 09 PHP
PHP 采集心得技巧
May 15 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
Jun 06 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
php对大文件进行读取操作的实现代码
Jan 23 PHP
利用curl抓取远程页面内容的示例代码
Jul 23 PHP
php求正负数数组中连续元素最大值示例
Apr 11 PHP
你应该知道PHP浮点数知识
May 13 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
php+redis消息队列实现抢购功能
Feb 08 PHP
laravel 实现设置时区的简单方法
Oct 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用正则表达式匹配URL的简单方法
2013/11/12 PHP
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
js面向对象的写法
2016/02/19 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
浅析node应用的timing-attack安全漏洞
2018/02/28 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
CSS3实现点击放大的动画实例代码
2017/02/27 HTML / CSS
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
如何用PHP实现邮件发送
2012/12/26 面试题
心得体会怎么写
2013/12/30 职场文书
syb养殖创业计划书
2014/01/09 职场文书