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 全局变量范围分析
Aug 07 PHP
PHP学习散记_编码(json_encode 中文不显示)
Nov 10 PHP
关于UEditor编辑器远程图片上传失败的解决办法
Aug 31 PHP
如何判断php数组的维度
Jun 10 PHP
PHP的拦截器实例分析
Nov 03 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
Oct 20 PHP
php、java、android、ios通用的3des方法(推荐)
Sep 09 PHP
Thinkphp整合微信支付功能
Dec 14 PHP
php unicode编码和字符串互转的方法
Aug 12 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
php libevent 功能与使用方法详解
Mar 04 PHP
Laravel框架源码解析之入口文件原理分析
May 14 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日历程序
2006/12/06 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
jquery ready函数源代码研究
2009/12/06 Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
2011/10/24 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
js select下拉联动 更具级联性!
2020/04/17 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
layer.confirm()右边按钮实现href的例子
2019/09/27 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
opencv python 2D直方图的示例代码
2018/07/20 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
汽车专业毕业生自荐信
2013/11/03 职场文书
中医药大学毕业生自荐信
2013/11/08 职场文书
户外亲子活动策划方案
2014/02/07 职场文书
给领导的检讨书
2014/02/16 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
作风建设年活动总结
2014/08/27 职场文书
小学科学教学计划
2015/01/21 职场文书
创建文明城市倡议书
2015/04/28 职场文书
MySQL外键约束(FOREIGN KEY)案例讲解
2021/08/23 MySQL
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers