话不多说 先放代码
/*************************
说明: 判断传递的变量中是否含有非法字符 如$_POST、$_GET
功能: 防注入
*************************/
//要过滤的非法字符
$ArrFiltrate=array("'","or","and","union","where","&","join");
//出错后要跳转的url,不填则默认前一页
$StrGoUrl="";
//判断是否存在非法字符
function FunStringExist($StrFiltrate,$ArrFiltrate){
foreach ($ArrFiltrate as $key=>$value){
if (@eregi($value,$StrFiltrate)){ //eregi(规则,被验证字符串) 不区分大小写的正则表达式匹配,该函数只支持php 4,5版本
return true;
}
}
return false;
}
//合并$_POST 和 $_GET
function merge_P_G($POST,$GET){
$HTTP_POST_VARS=$POST;
$HTTP_GET_VARS=$GET;
foreach($HTTP_POST_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
foreach($HTTP_GET_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
return $ArrPostAndGet;
}
//验证开始
$ArrPostAndGet=merge_P_G($_POST,$_GET);
foreach($ArrPostAndGet as $key=>$value){
if (FunStringExist($value,$ArrFiltrate)){ //返回 true 说明含有非法字符串
if (empty($StrGoUrl)){
//让它返回上一步,也可以让它退出登录,还可把本次操作加入日志(该用户非法操作)
echo "<script language='javascript'>history.go(-1);</script>";
}else{
echo "<script language='javascript'>window.location='".$StrGoUrl."';</script>";
}
exit;
} else{
//不含有非法字符串,不做操作
$_GET=$_GET;
$_POST=$_POST;
}
}
/***************结束防止PHP注入*****************/
讲一讲博主为什么要做这个:
起初是因为博主在登录界面发现了一个 bug ,什么 bug 呢?
有个万能用户名竟然能登进博主 OA 系统,什么万能用户名呢?
’or’ 1=1,好像是这,总之它含有 or 字母,我们过滤了or 字母,就可以避免这个 bug 了
*get参数是在 url 里可见的,当我们在 = 后边输入要过滤的非法字符时,也会实现过滤 *
注 : 代码虽不是博主原创,但也是博主精心调试改进的结果,能够解决一个问题,终究是好的结果