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) { // 若文件大于521B文件取头和尾
$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))