PHP 过滤 $_POST 或 $_GET 接收的参数

话不多说 先放代码

/************************* 
说明: 判断传递的变量中是否含有非法字符 如$_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 里可见的,当我们在 = 后边输入要过滤的非法字符时,也会实现过滤 *


注 : 代码虽不是博主原创,但也是博主精心调试改进的结果,能够解决一个问题,终究是好的结果


猜你喜欢

转载自blog.csdn.net/qq_42961790/article/details/91395083
今日推荐