@@ -137,6 +137,96 @@ function dede_random_bytes($length) | |||||
} | } | ||||
return FALSE; | return FALSE; | ||||
} | } | ||||
//SQL语句过滤程序,由80sec提供,这里作了适当的修改 | |||||
if (!function_exists('CheckSql')) { | |||||
function CheckSql($db_string, $querytype = 'select') | |||||
{ | |||||
global $cfg_cookie_encode; | |||||
$clean = ''; | |||||
$error = ''; | |||||
$old_pos = 0; | |||||
$pos = -1; | |||||
$enkey = substr(md5(substr($cfg_cookie_encode.'dedebiz', 0, 5)), 0, 10); | |||||
$log_file = DEDEDATA.'/checksql_'.$enkey.'_safe.txt'; | |||||
$userIP = GetIP(); | |||||
$getUrl = GetCurUrl(); | |||||
//如果是普通查询语句,直接过滤一些特殊语法 | |||||
if ($querytype == 'select') { | |||||
$notallow1 = "[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}"; | |||||
//$notallow2 = "--|/\*"; | |||||
if (preg_match("/".$notallow1."/i", $db_string)) { | |||||
fputs(fopen($log_file, 'a+'), "$userIP||$getUrl||$db_string||SelectBreak\r\n"); | |||||
exit("<span>Safe Alert: Request Error step 1 !</span>"); | |||||
} | |||||
} | |||||
//完整的SQL检查 | |||||
while (TRUE) { | |||||
$pos = strpos($db_string, '\'', $pos + 1); | |||||
if ($pos === FALSE) { | |||||
break; | |||||
} | |||||
$clean .= substr($db_string, $old_pos, $pos - $old_pos); | |||||
while (TRUE) { | |||||
$pos1 = strpos($db_string, '\'', $pos + 1); | |||||
$pos2 = strpos($db_string, '\\', $pos + 1); | |||||
if ($pos1 === FALSE) { | |||||
break; | |||||
} elseif ($pos2 == FALSE || $pos2 > $pos1) { | |||||
$pos = $pos1; | |||||
break; | |||||
} | |||||
$pos = $pos2 + 1; | |||||
} | |||||
$clean .= '$s$'; | |||||
$old_pos = $pos + 1; | |||||
} | |||||
$clean .= substr($db_string, $old_pos); | |||||
$clean = trim(strtolower(preg_replace(array('~\s+~s'), array(' '), $clean))); | |||||
if ( | |||||
strpos($clean, '@') !== FALSE or strpos($clean, 'char(') !== FALSE or strpos($clean, '"') !== FALSE | |||||
or strpos($clean, '$s$$s$') !== FALSE | |||||
) { | |||||
$fail = TRUE; | |||||
if (preg_match("#^create table#i", $clean)) $fail = FALSE; | |||||
$error = "unusual character"; | |||||
} | |||||
//老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以检查它 | |||||
if (strpos($clean, 'union') !== FALSE && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "union detect"; | |||||
} | |||||
//发布版本的程序可能比较少包括--,#这样的注释,但是黑客经常使用它们 | |||||
elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== FALSE || strpos($clean, '#') !== FALSE) { | |||||
$fail = TRUE; | |||||
$error = "comment detect"; | |||||
} | |||||
//这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库 | |||||
elseif (strpos($clean, 'sleep') !== FALSE && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "slown down detect"; | |||||
} elseif (strpos($clean, 'benchmark') !== FALSE && preg_match('~(^|[^a-z])benchmark($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "slown down detect"; | |||||
} elseif (strpos($clean, 'load_file') !== FALSE && preg_match('~(^|[^a-z])load_file($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "file fun detect"; | |||||
} elseif (strpos($clean, 'into outfile') !== FALSE && preg_match('~(^|[^a-z])into\s+outfile($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "file fun detect"; | |||||
} | |||||
//老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息 | |||||
elseif (preg_match('~\([^)]*?select~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "sub select detect"; | |||||
} | |||||
if (!empty($fail)) { | |||||
fputs(fopen($log_file, 'a+'), "$userIP||$getUrl||$db_string||$error\r\n"); | |||||
exit("<span>Safe Alert: Request Error step 2!</span>"); | |||||
} else { | |||||
return $db_string; | |||||
} | |||||
} | |||||
} | |||||
/** | /** | ||||
* 载入小助手,系统默认载入小助手 | * 载入小助手,系统默认载入小助手 | ||||
* 在/data/helper.inc.php中进行默认小助手初始化的设置 | * 在/data/helper.inc.php中进行默认小助手初始化的设置 | ||||
@@ -473,7 +473,9 @@ class DedeSqli | |||||
} | } | ||||
function RecordLog($runtime = 0) | function RecordLog($runtime = 0) | ||||
{ | { | ||||
$RecordLogFile = DEDEDATA.'/mysqli_record_log.inc'; | |||||
global $cfg_cookie_encode; | |||||
$enkey = substr(md5(substr($cfg_cookie_encode.'dedebiz', 0, 5)), 0, 10); | |||||
$RecordLogFile = DEDEDATA.'/mysqli_record_log_'.$enkey.'.inc'; | |||||
$url = $this->GetCurUrl(); | $url = $this->GetCurUrl(); | ||||
$savemsg = <<<EOT | $savemsg = <<<EOT | ||||
@@ -489,7 +491,9 @@ EOT; | |||||
//显示数据链接错误信息 | //显示数据链接错误信息 | ||||
function DisplayError($msg) | function DisplayError($msg) | ||||
{ | { | ||||
$errorTrackFile = DEDEDATA.'/mysqli_error_trace.inc'; | |||||
global $cfg_cookie_encode; | |||||
$enkey = substr(md5(substr($cfg_cookie_encode.'dedebiz', 0, 5)), 0, 10); | |||||
$errorTrackFile = DEDEDATA.'/mysqli_error_trace_'.$enkey.'.inc'; | |||||
if ($this->showError) { | if ($this->showError) { | ||||
$msg = str_replace(array("\r","\n"),"",addslashes($msg)); | $msg = str_replace(array("\r","\n"),"",addslashes($msg)); | ||||
ShowMsg("{$msg}", "javascript:;", -1); | ShowMsg("{$msg}", "javascript:;", -1); | ||||
@@ -522,93 +526,4 @@ EOT; | |||||
function CopySQLiPoint(&$ndsql) | function CopySQLiPoint(&$ndsql) | ||||
{ | { | ||||
$GLOBALS['dsqli'] = $ndsql; | $GLOBALS['dsqli'] = $ndsql; | ||||
} | |||||
//SQL语句过滤程序,由80sec提供,这里作了适当的修改 | |||||
if (!function_exists('CheckSql')) { | |||||
function CheckSql($db_string, $querytype = 'select') | |||||
{ | |||||
global $cfg_cookie_encode; | |||||
$clean = ''; | |||||
$error = ''; | |||||
$old_pos = 0; | |||||
$pos = -1; | |||||
$log_file = DEDEDATA.'/'.md5($cfg_cookie_encode).'_safe.txt'; | |||||
$userIP = GetIP(); | |||||
$getUrl = GetCurUrl(); | |||||
//如果是普通查询语句,直接过滤一些特殊语法 | |||||
if ($querytype == 'select') { | |||||
$notallow1 = "[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}"; | |||||
//$notallow2 = "--|/\*"; | |||||
if (preg_match("/".$notallow1."/i", $db_string)) { | |||||
fputs(fopen($log_file, 'a+'), "$userIP||$getUrl||$db_string||SelectBreak\r\n"); | |||||
exit("<span>Safe Alert: Request Error step 1 !</span>"); | |||||
} | |||||
} | |||||
//完整的SQL检查 | |||||
while (TRUE) { | |||||
$pos = strpos($db_string, '\'', $pos + 1); | |||||
if ($pos === FALSE) { | |||||
break; | |||||
} | |||||
$clean .= substr($db_string, $old_pos, $pos - $old_pos); | |||||
while (TRUE) { | |||||
$pos1 = strpos($db_string, '\'', $pos + 1); | |||||
$pos2 = strpos($db_string, '\\', $pos + 1); | |||||
if ($pos1 === FALSE) { | |||||
break; | |||||
} elseif ($pos2 == FALSE || $pos2 > $pos1) { | |||||
$pos = $pos1; | |||||
break; | |||||
} | |||||
$pos = $pos2 + 1; | |||||
} | |||||
$clean .= '$s$'; | |||||
$old_pos = $pos + 1; | |||||
} | |||||
$clean .= substr($db_string, $old_pos); | |||||
$clean = trim(strtolower(preg_replace(array('~\s+~s'), array(' '), $clean))); | |||||
if ( | |||||
strpos($clean, '@') !== FALSE or strpos($clean, 'char(') !== FALSE or strpos($clean, '"') !== FALSE | |||||
or strpos($clean, '$s$$s$') !== FALSE | |||||
) { | |||||
$fail = TRUE; | |||||
if (preg_match("#^create table#i", $clean)) $fail = FALSE; | |||||
$error = "unusual character"; | |||||
} | |||||
//老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以检查它 | |||||
if (strpos($clean, 'union') !== FALSE && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "union detect"; | |||||
} | |||||
//发布版本的程序可能比较少包括--,#这样的注释,但是黑客经常使用它们 | |||||
elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== FALSE || strpos($clean, '#') !== FALSE) { | |||||
$fail = TRUE; | |||||
$error = "comment detect"; | |||||
} | |||||
//这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库 | |||||
elseif (strpos($clean, 'sleep') !== FALSE && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "slown down detect"; | |||||
} elseif (strpos($clean, 'benchmark') !== FALSE && preg_match('~(^|[^a-z])benchmark($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "slown down detect"; | |||||
} elseif (strpos($clean, 'load_file') !== FALSE && preg_match('~(^|[^a-z])load_file($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "file fun detect"; | |||||
} elseif (strpos($clean, 'into outfile') !== FALSE && preg_match('~(^|[^a-z])into\s+outfile($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "file fun detect"; | |||||
} | |||||
//老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息 | |||||
elseif (preg_match('~\([^)]*?select~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "sub select detect"; | |||||
} | |||||
if (!empty($fail)) { | |||||
fputs(fopen($log_file, 'a+'), "$userIP||$getUrl||$db_string||$error\r\n"); | |||||
exit("<span>Safe Alert: Request Error step 2!</span>"); | |||||
} else { | |||||
return $db_string; | |||||
} | |||||
} | |||||
} | } |
@@ -487,7 +487,9 @@ class DedeSqlite | |||||
} | } | ||||
function RecordLog($runtime = 0) | function RecordLog($runtime = 0) | ||||
{ | { | ||||
$RecordLogFile = DEDEDATA.'/mysqli_record_log.inc'; | |||||
global $cfg_cookie_encode; | |||||
$enkey = substr(md5(substr($cfg_cookie_encode.'dedebiz', 0, 5)), 0, 10); | |||||
$RecordLogFile = DEDEDATA.'/mysqli_record_log_'.$enkey.'.inc'; | |||||
$url = $this->GetCurUrl(); | $url = $this->GetCurUrl(); | ||||
$savemsg = <<<EOT | $savemsg = <<<EOT | ||||
@@ -503,7 +505,9 @@ EOT; | |||||
//显示数据链接错误信息 | //显示数据链接错误信息 | ||||
function DisplayError($msg) | function DisplayError($msg) | ||||
{ | { | ||||
$errorTrackFile = DEDEDATA.'/sqlite_error_trace.inc'; | |||||
global $cfg_cookie_encode; | |||||
$enkey = substr(md5(substr($cfg_cookie_encode.'dedebiz', 0, 5)), 0, 10); | |||||
$errorTrackFile = DEDEDATA.'/sqlite_error_trace_'.$enkey.'.inc'; | |||||
if ($this->showError) { | if ($this->showError) { | ||||
$msg = str_replace(array("\r","\n"),"",addslashes($msg)); | $msg = str_replace(array("\r","\n"),"",addslashes($msg)); | ||||
ShowMsg("{$msg}", "javascript:;", -1); | ShowMsg("{$msg}", "javascript:;", -1); | ||||
@@ -536,93 +540,4 @@ EOT; | |||||
function CopySQLiPoint(&$ndsql) | function CopySQLiPoint(&$ndsql) | ||||
{ | { | ||||
$GLOBALS['dsqlite'] = $ndsql; | $GLOBALS['dsqlite'] = $ndsql; | ||||
} | |||||
//SQL语句过滤程序,由80sec提供,这里作了适当的修改 | |||||
if (!function_exists('CheckSql')) { | |||||
function CheckSql($db_string, $querytype = 'select') | |||||
{ | |||||
global $cfg_cookie_encode; | |||||
$clean = ''; | |||||
$error = ''; | |||||
$old_pos = 0; | |||||
$pos = -1; | |||||
$log_file = DEDEINC.'/../data/'.md5($cfg_cookie_encode).'_safe.txt'; | |||||
$userIP = GetIP(); | |||||
$getUrl = GetCurUrl(); | |||||
//如果是普通查询语句,直接过滤一些特殊语法 | |||||
if ($querytype == 'select') { | |||||
$notallow1 = "[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}"; | |||||
//$notallow2 = "--|/\*"; | |||||
if (preg_match("/".$notallow1."/i", $db_string)) { | |||||
fputs(fopen($log_file, 'a+'), "$userIP||$getUrl||$db_string||SelectBreak\r\n"); | |||||
exit("<span>Safe Alert: Request Error step 1 !</span>"); | |||||
} | |||||
} | |||||
//完整的SQL检查 | |||||
while (TRUE) { | |||||
$pos = strpos($db_string, '\'', $pos + 1); | |||||
if ($pos === FALSE) { | |||||
break; | |||||
} | |||||
$clean .= substr($db_string, $old_pos, $pos - $old_pos); | |||||
while (TRUE) { | |||||
$pos1 = strpos($db_string, '\'', $pos + 1); | |||||
$pos2 = strpos($db_string, '\\', $pos + 1); | |||||
if ($pos1 === FALSE) { | |||||
break; | |||||
} elseif ($pos2 == FALSE || $pos2 > $pos1) { | |||||
$pos = $pos1; | |||||
break; | |||||
} | |||||
$pos = $pos2 + 1; | |||||
} | |||||
$clean .= '$s$'; | |||||
$old_pos = $pos + 1; | |||||
} | |||||
$clean .= substr($db_string, $old_pos); | |||||
$clean = trim(strtolower(preg_replace(array('~\s+~s'), array(' '), $clean))); | |||||
if ( | |||||
strpos($clean, '@') !== FALSE or strpos($clean, 'char(') !== FALSE or strpos($clean, '"') !== FALSE | |||||
or strpos($clean, '$s$$s$') !== FALSE | |||||
) { | |||||
$fail = TRUE; | |||||
if (preg_match("#^create table#i", $clean)) $fail = FALSE; | |||||
$error = "unusual character"; | |||||
} | |||||
//老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以检查它 | |||||
if (strpos($clean, 'union') !== FALSE && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "union detect"; | |||||
} | |||||
//发布版本的程序可能比较少包括--,#这样的注释,但是黑客经常使用它们 | |||||
elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== FALSE || strpos($clean, '#') !== FALSE) { | |||||
$fail = TRUE; | |||||
$error = "comment detect"; | |||||
} | |||||
//这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库 | |||||
elseif (strpos($clean, 'sleep') !== FALSE && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "slown down detect"; | |||||
} elseif (strpos($clean, 'benchmark') !== FALSE && preg_match('~(^|[^a-z])benchmark($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "slown down detect"; | |||||
} elseif (strpos($clean, 'load_file') !== FALSE && preg_match('~(^|[^a-z])load_file($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "file fun detect"; | |||||
} elseif (strpos($clean, 'into outfile') !== FALSE && preg_match('~(^|[^a-z])into\s+outfile($|[^[a-z])~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "file fun detect"; | |||||
} | |||||
//老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息 | |||||
elseif (preg_match('~\([^)]*?select~s', $clean) != 0) { | |||||
$fail = TRUE; | |||||
$error = "sub select detect"; | |||||
} | |||||
if (!empty($fail)) { | |||||
fputs(fopen($log_file, 'a+'), "$userIP||$getUrl||$db_string||$error\r\n"); | |||||
exit("<span>Safe Alert: Request Error step 2!</span>"); | |||||
} else { | |||||
return $db_string; | |||||
} | |||||
} | |||||
} | } |