帝国CMS 修复头像上传挂马漏洞BUG 防止上传病毒图片头像
内容简介
帝国CMS 修复头像上传挂马漏洞BUG 防止上传病毒图片头像安全验证:检查恶意代码\e\member\class\member_edit
网站描述
帝国CMS 修复头像上传挂马漏洞BUG 防止上传病毒图片头像
安全验证:检查恶意代码
\e\member\class\member_editinfofun.php
搜索:$upic=eMember_UpicReturnGupic($filetype);
在这个代码上面添加
// 安全验证:检查文件内容是否包含恶意代码
if(!checkAvatarFileSecurity($file, $file_name)) {
echo <script>alert(&39;头像文件可能包含恶意代码,上传被阻止&39;);history.go(-1);</script>;
db_close();
$empire=null;
exit();
}头像文件安全验证
然后在最底部的 ?>前面添加下面的函数
/**
* 头像文件安全验证
* @param string $file 临时文件路径
* @param string $fileName 文件名
* @return bool 安全返回true,可疑返回false
*/
function checkAvatarFileSecurity($file, $fileName) {
// 检查文件是否存在
if (!file_exists($file)) {
return false;
}
// 检查文件大小
$fileSize = filesize($file);
if ($fileSize === 0) {
return false;
}
// 读取文件内容
$fileContent = file_get_contents($file);
// 检测常见恶意代码模式
$maliciousPatterns = [
// PHP代码注入
&39;/<\?(php|=|\s)/i&39;,
&39;/eval\(/i&39;,
&39;/base64_decode\(/i&39;,
&39;/system\(/i&39;,
&39;/exec\(/i&39;,
&39;/shell_exec\(/i&39;,
&39;/passthru\(/i&39;,
&39;/proc_open\(/i&39;,
&39;/popen\(/i&39;,
// JavaScript代码注入
&39;/<script[^>]*>/i&39;,
&39;/javascript:/i&39;,
&39;/onload=/i&39;,
&39;/onerror=/i&39;,
&39;/onclick=/i&39;,
&39;/onmouseover=/i&39;,
// HTML注入
&39;/<iframe[^>]*>/i&39;,
&39;/<object[^>]*>/i&39;,
&39;/<embed[^>]*>/i&39;,
&39;/<applet[^>]*>/i&39;,
// Shell脚本
&39;/!\/bin\//i&39;,
&39;/!\/usr\/bin\//i&39;,
&39;/\/bin\/bash/i&39;,
&39;/\/bin\/sh/i&39;,
// 可疑字符串
&39;/phpspy/i&39;,
&39;/c99shell/i&39;,
&39;/r57shell/i&39;,
&39;/webadmin/i&39;,
&39;/backdoor/i&39;,
&39;/trojan/i&39;,
&39;/malware/i&39;,
&39;/virus/i&39;,
];
foreach ($maliciousPatterns as $pattern) {
if (preg_match($pattern, $fileContent)) {
return false;
}
}
// 检查文件头是否与扩展名匹配
$fileHeader = substr($fileContent, 0, 10); // 只检查前10个字节
$extension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
$validHeaders = [
&39;jpg&39; => \xFF\xD8,
&39;jpeg&39; => \xFF\xD8,
&39;png&39; => \x89PNG,
&39;gif&39; => GIF8,
&39;bmp&39; => BM,
&39;webp&39; => RIFF
];
if (isset($validHeaders[$extension])) {
$expectedHeader = $validHeaders[$extension];
if (strpos($fileHeader, $expectedHeader) !== 0) {
return false;
}
}
// 检查文件是否包含过多空字符(可能是二进制可执行文件)
$nullCount = substr_count($fileContent, \x00);
if ($nullCount > $fileSize * 0.3) { // 超过30%的空字符
return false;
}
// 检查文件是否包含过长行(可能是编码的恶意代码)
$lines = explode(\n, $fileContent);
foreach ($lines as $line) {
if (strlen($line) > 5000) { // 单行超过5000字符
return false;
}
}
return true;
}