天天看點

PHP 超強過濾函數

PHP 超強過濾函數

你有每次要過濾的時候總是去翻以前的過濾代碼的時候麼?

你有搜尋過如何防過濾,防攻擊的PHP解決方法麼?

你有對完全遵循'過濾輸入,避免輸出',Web界經典說辭麼?

    其實這些問題,就是需要我們時常的過濾掉輸入的資料,那麼,根據寫了這麼多代碼的經驗來看,過濾白名單方式比較靠譜!

當然,你有什麼更好的代碼什麼的,歡迎留言讨論!

發現最近總是在寫過濾的一些問題,也寫了一兩年PHP了,發現過濾問題一直是個大問題,不才,下面整理出來了一個通用的基于白名單的過濾函數,

如果發現你那裡用不了,聯系我的qq852208555,一起探讨吧!

    GBK GB2312 編碼的實作       

<?php 
//白名單過濾模式開始
$a='愛樂sdsadDDA22313\'@';
echo AlFilter($a,'CWD_','@\'');
/*過濾類分為幾種類型 
 * $str(待過濾字元串),$operate(操作碼),$ext(白名單擴充)
 * 操作碼簡寫(不分大小寫):1.漢字C 2.數字D 3.字母W 4.特殊符号T 5.下劃線_
	經典的調用模式:
	隻允許數字:AlFilter($a,'D')
	隻允許漢字:AlFilter($a,'C')
	隻允許字母數組漢字:AlFilter($a,'CWD')
	允許字母數字漢字下劃線特殊字元:AlFilter($a,'CWD_T')
	
擴充模式:AlFilter($a,'CWD_T','@')
    AlFilter($a,'CWD_','@');//允許特殊字元 @
    AlFilter($a,'CWD_','@\'');//允許特殊字元 @ '(加了反斜杠轉義)
*/
function AlFilter($str=NULL,$operate,$ext=NULL){
   $str =  trim(str_replace(PHP_EOL, '', $str));//去換行機制
	if(!$str) return 0;
	//比對模式 $pattern
	$Cp="".chr(0xa1)."-".chr(0xff)."";
	$Dp='0-9';
	$Wp='a-zA-Z';
	$Tp='@#$%^&*()-+=';
	$_p='_';
	
	$pattern="/^[";
	$OArr=str_split(strtolower($operate));//拆分操作符
	if (in_array('c', $OArr)) $pattern.=$Cp;
	if (in_array('d', $OArr)) $pattern.=$Dp;
	if (in_array('w', $OArr)) $pattern.=$Wp;
	if (in_array('t', $OArr)) $pattern.=$Tp;
	if (in_array('_', $OArr)) $pattern.=$_p;
	if($ext) $pattern.=$ext;
	$pattern.="]+$/";
	if(!preg_match($pattern,$str))
		return 0;
	else 
		return $str;
		
}
           
下面是UTF-8的模式:(主要是漢字比對不同)
AlFilter($str=NULL,$operate,$ext=NULL){
        $str = trim(str_replace(PHP_EOL, '', $str));//去換行機制
	if(!$str) return 0;
	//比對模式 $pattern
	$Cp="\x{4e00}-\x{9fff}";
	$Dp='0-9';
	$Wp='a-zA-Z';
	$Tp='@#$%^&*()-+=';
	$_p='_';
	
	$pattern="/^[";
	$OArr=str_split(strtolower($operate));//拆分操作符
	if (in_array('c', $OArr)) $pattern.=$Cp;
	if (in_array('d', $OArr)) $pattern.=$Dp;
	if (in_array('w', $OArr)) $pattern.=$Wp;
	if (in_array('t', $OArr)) $pattern.=$Tp;
	if (in_array('_', $OArr)) $pattern.=$_p;
	if($ext) $pattern.=$ext;
	$pattern.="]+$/u";
	if(!preg_match($pattern,$str))
		return 0;
	else 
		return $str;
		
}
           

當然也可以隻用UTF-8 GBK的轉碼過去比對...反之亦然,不過我覺得麻煩當然有什麼更好地改進辦法,歡迎大家讨論,不吝賜教!

轉載說明來自 愛樂愛快樂 我的部落格位址:http://blog.csdn.net/lovehappying本文位址http://blog.csdn.net/lovehappying/article/details/24180003