<?php
class sqlsafe {
//(and|or)\b 表示以and和or结尾的单词如:aand,band,都可以匹配
//如果匹配and或or则使用 \b(and|or)\b来匹配单词;
// \/ 匹配/ 在写法上/表示意义相同
// \* 匹配* 在写法上*表示意义相同
// \s 表示匹配空白字符;
private $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)";
//int preg_match ( string $pattern , string $subject [, array &$matches [,
// int $flags = 0 [, int $offset = 0 ]]] )
//搜索subject与pattern给定的正则表达式的一个匹配.
//如果提供了参数matches, 它讲被填充为搜索结果. $matches[0]将包含完整模式
//匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本, 以此类推
// \b(and|or)\b.{1,6}? 匹配and or后面的第一个字符
private $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)";
private $cookiefilter = "\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)";
/**
* 构造函数
*/
public function __construct() {
if(!empty($_GET)){
foreach($_GET as $key=>$value)
{$this->stopattack($key,$value,$this->getfilter);}
}
if(!empty($_POST)) {
foreach ($_POST as $key => $value) {
$this->stopattack($key, $value, $this->postfilter);
}
}
if(!empty($_POST)) {
foreach ($_COOKIE as $key => $value) {
$this->stopattack($key, $value, $this->cookiefilter);
}
}
}
/**
* 参数检查并写日志
*/
public function stopattack($StrFiltKey, $StrFiltValue, $ArrFiltReq){
if(is_array($StrFiltValue))$StrFiltValue = implode($StrFiltValue);
if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue,$arr) == 1){
var_dump($arr);
// $this->writeslog($_SERVER["REMOTE_ADDR"]." ".strftime("%Y-%m-%d %H:%M:%S")."
".$_SERVER["PHP_SELF"]." ".$_SERVER["REQUEST_METHOD"]." ".$StrFiltKey." ".$StrFiltValue);
echo ('您提交的参数非法,系统已记录您的本次操作!');
}
}
/**
* SQL注入日志
*/
public function writeslog($log){
$log_path = CACHE_PATH.'logs'.DIRECTORY_SEPARATOR.'sql_log.txt';
$ts = fopen($log_path,"a+");
fputs($ts,$log."
");
fclose($ts);
}
}
$sql=new sqlsafe();
?>