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