function StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq){
if(is_array($StrFiltValue))
{
$StrFiltValue=implode($StrFiltValue);
}
if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){
slog("<br><br>操作IP: ".$_SERVER["REMOTE_ADDR"]."<br>操作时间: ".strftime("%Y-%m-%d %H:%M:%S")."<br>操作页面:".$_SERVER["PHP_SELF"]."<br>提交方式: ".$_SERVER["REQUEST_METHOD"]."<br>提交参数: ".$StrFiltKey."<br>提交数据: ".$StrFiltValue);
print "360websec notice:Illegal operation!";
exit();
}
}
function slog($logs)
{
$toppath=$_SERVER["DOCUMENT_ROOT"]."/log.htm";
$Ts=fopen($toppath,"a+");
fputs($Ts,$logs."\r\n");
fclose($Ts);
}
function get($varname,$handle){
$value = $_GET[$varname];
switch ($handle) {
case 'sql':
$getfilter="'|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
StopAttack($varname,$value,$getfilter);
break;
case 'html':
$value = trim(strip_tags($value));
break;
default:
$value =$value;
break;
}
return $value;
}
function post($varname,$handle){
$value = $_POST[$varname];
switch ($handle) {
case 'sql':
$postfilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
StopAttack($varname,$value,$postfilter);
break;
case 'html':
$value = trim(strip_tags($value));
break;
default:
$value =$value;
break;
}
return $value;
}
这些过滤代码是参考360给出的,然后在360的基础上进行了修改。
主要功能,就是通过自定义的 get 和post函数 来代替$_GET和$_POST来取值,并且加入了第二个参数,参数为2种,html,sql,如果是sql就执行过滤sql注入,如果是html就过滤html标签,然后 返回过滤后的值。
ps:要针对不同的路径进行处理,即对某些路径如后台某些加入白名单不进行相应处理,因为某些页面会用到富文本编辑器。
转自:http://psacms.com/thread-2639-1-1.html