Blog / 阅读

PHP 超强过滤函数

by admin on 2014-04-20 15:16:51 in ,



PHP 超强过滤函数
你有每次要过滤的时候总是去翻以前的过滤代码的时候么?
你有搜索过如何防过滤,防攻击的PHP解决方法么?
你有对完全遵循'过滤输入,避免输出',Web界经典说辞么?
    其实这些问题,就是需要我们时常的过滤掉输入的数据,那么,根据写了这么多代码的经验来看,过滤白名单方式比较靠谱!
当然,你有什么更好的代码什么的,欢迎留言讨论!


发现最近总是在写过滤的一些问题,也写了一两年PHP了,发现过滤问题一直是个大问题,不才,下面整理出来了一个通用的基于白名单的过滤函数,
如果发现你那里用不了,联系我的qq852208555,一起探讨吧!
    GBK GB2312 编码的实现       
[php] view plaincopyprint?
<?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的模式:(主要是汉字匹配不同)
[php] view plaincopyprint?
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的转码过去匹配...反之亦然,不过我觉得麻烦当然有什么更好地改进办法,欢迎大家讨论,不吝赐教!


写评论

相关文章

上一篇:图片浏览上传兼容所有浏览器

下一篇:jQuery源码 框架分析

评论

写评论

* 必填.

分享

栏目

赞助商


热门文章

Tag 云