当前位置:首页 > PHP教程 > php函数 > 列表

PHP利用str_replace()函数防注入

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-22 10:44:16 浏览: 评论:0 

str_replace()函数的使用就是用来替换指定字符了,那么我们正好可以利用它这一点来过滤敏感字符以太到防注入的效果,下面我来给大家总结了一些方法,给大家分享一下.

PHP各种过滤字符函数,代码如下:

  1. <?php 
  2.     /** 
  3.     * 安全过滤函数 
  4.     * 
  5.     * @param $string 
  6.     * @return string 
  7.     */ 
  8.     function safe_replace($string) { 
  9.     $string = str_replace('%20','',$string); 
  10.     $string = str_replace('%27','',$string); 
  11.     $string = str_replace('%2527','',$string); 
  12.     $string = str_replace('*','',$string); 
  13.     $string = str_replace('"','&quot;',$string); 
  14.     $string = str_replace("'",'',$string); 
  15.     $string = str_replace('"','',$string); 
  16.     $string = str_replace(';','',$string); 
  17.     $string = str_replace('<','&lt;',$string); 
  18.     $string = str_replace('>','&gt;',$string); 
  19.     $string = str_replace("{",'',$string); 
  20.     $string = str_replace('}','',$string); 
  21.     $string = str_replace('','',$string); 
  22.     return $string
  23.     } 
  24.     ?> 
  25.  
  26.  
  27.     <?php 
  28.     /** 
  29.     * 返回经addslashes处理过的字符串或数组 
  30.     * @param $string 需要处理的字符串或数组 
  31.     * @return mixed 
  32.     */ 
  33.     function new_addslashes($string) { 
  34.     if(!is_array($string)) return addslashes($string); 
  35.     foreach($string as $key => $val$string[$key] = new_addslashes($val); 
  36.     return $string
  37.     } 
  38.     ?> 
  39.  
  40.  
  41.     <?php 
  42.     //对请求的字符串进行安全处理 
  43.     /* 
  44.     $safestep 
  45.     0 为不处理, 
  46.     1 为禁止不安全HTML内容(javascript等), 
  47.     2 完全禁止HTML内容,并替换部份不安全字符串(如:eval(、union、CONCAT(、--、等) 
  48.     */ 
  49.     function StringSafe($str$safestep=-1){ 
  50.     $safestep = ($safestep > -1) ? $safestep : 1; 
  51.     if($safestep == 1){ 
  52.     $str = preg_replace("#script:#i""script:"$str); 
  53.     $str = preg_replace("#<[/]{0,1}(link|meta|ifr|fra|scr)[^>]*>#isU"''$str); 
  54.     $str = preg_replace("#[ ]{1,}#"' '$str); 
  55.     return $str
  56.     }else if($safestep == 2){ 
  57.     $str = addslashes(htmlspecialchars(stripslashes($str))); 
  58.     $str = preg_replace("#eval#i"'eval'$str); 
  59.     $str = preg_replace("#union#i"'union'$str); 
  60.     $str = preg_replace("#concat#i"'concat'$str); 
  61.     $str = preg_replace("#--#"'--'$str); 
  62.     $str = preg_replace("#[ ]{1,}#"' '$str); 
  63.     return $str
  64.     }else
  65.     return $str
  66.     } 
  67.     } 
  68.     ?> 
  69.  
  70.  
  71.     <?php 
  72.        /** 
  73.         +---------------------------------------------------------- 
  74.         * 输出安全的html,用于过滤危险代码 
  75.         +---------------------------------------------------------- 
  76.         * @access public 
  77.         +---------------------------------------------------------- 
  78.         * @param string $text 要处理的字符串 
  79.         * @param mixed $tags 允许的标签列表,如 table|td|th|td 
  80.         +---------------------------------------------------------- 
  81.         * @return string 
  82.         +---------------------------------------------------------- 
  83.         */ 
  84.        static public function safeHtml($text$tags = null) 
  85.        { 
  86.            $text =  trim($text); 
  87.            //完全过滤注释 
  88.            $text = preg_replace('/<!--?.*-->/','',$text); 
  89.            //完全过滤动态代码 
  90.            $text =  preg_replace('/<?|?'.'>/','',$text); 
  91.            //完全过滤js 
  92.            $text = preg_replace('/<script?.*/script>/','',$text); 
  93.            $text =  str_replace('[','&#091;',$text); 
  94.            $text = str_replace(']','&#093;',$text); 
  95.            $text =  str_replace('|','&#124;',$text); 
  96.            //过滤换行符 
  97.            $text = preg_replace('/ ? /','',$text); 
  98.            //br 
  99.            $text =  preg_replace('/<br(s/)?'.'>/i','[br]',$text); 
  100.            $text = preg_replace('/([br]s*){10,}/i','[br]',$text); 
  101.            //过滤危险的属性,如:过滤on事件lang js 
  102.            while(preg_match('/(<[^><]+)(lang|on|action|background|codebase|dynsrc|lowsrc)[^><]+/i',$text,$mat)){ 
  103.                $text=str_replace($mat[0],$mat[1],$text); 
  104.            } 
  105.            while(preg_match('/(<[^><]+)(window.|javascript:|js:|about:|file:|document.|vbs:|cookie)([^><]*)/i',$text,$mat)){ 
  106.                $text=str_replace($mat[0],$mat[1].$mat[3],$text); 
  107.            } 
  108.            ifemptyempty($allowTags) ) { $allowTags = self::$htmlTags['allow']; } 
  109.            //允许的HTML标签 
  110.            $text =  preg_replace('/<('.$allowTags.')( [^><[]]*)>/i','[12]',$text); 
  111.            //过滤多余html 
  112.            if ( emptyempty($banTag) ) { $banTag = self::$htmlTags['ban']; } 
  113.            $text =  preg_replace('/</?('.$banTag.')[^><]*>/i','',$text); 
  114.            //过滤合法的html标签 
  115.            while(preg_match('/<([a-z]+)[^><[]]*>[^><]*</1>/i',$text,$mat)){ 
  116.                $text=str_replace($mat[0],str_replace('>',']',str_replace('<','[',$mat[0])),$text); 
  117.            } 
  118.            //转换引号 
  119.            while(preg_match('/([[^[]]*=s*)("|')([^2=[]]+)2([^[]]*])/i',$text,$mat)){ 
  120.                $text=str_replace($mat[0],$mat[1].'|'.$mat[3].'|'.$mat[4],$text); 
  121.            } 
  122.            //空属性转换 
  123.            $text =  str_replace('''','||',$text); 
  124.            $text = str_replace('""','||',$text); 
  125.            //过滤错误的单个引号 
  126.            while(preg_match('/[[^[]]*("|')[^[]]*]/i',$text,$mat)){ 
  127.                $text=str_replace($mat[0],str_replace($mat[1],'',$mat[0]),$text); 
  128.            } 
  129.            //转换其它所有不合法的 < > 
  130.            $text =  str_replace('<','&lt;',$text); 
  131.            $text = str_replace('>','&gt;',$text); 
  132.            $text = str_replace('"','&quot;',$text); 
  133.            //反转换 
  134.            $text =  str_replace('[','<',$text); 
  135.            $text =  str_replace(']','>',$text); 
  136.            $text =  str_replace('|','"',$text); 
  137.            //过滤多余空格 
  138.            $text =  str_replace('  ',' ',$text); 
  139.            return $text
  140.        } 
  141.     ?> 
  142.  
  143.  
  144.     <?php 
  145.     function RemoveXSS($val) {  
  146.        // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed  
  147.        // this prevents some character re-spacing such as <javascript>  
  148.        // note that you have to handle splits with , , and later since they *are* allowed in some          // inputs  
  149.        $val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19])/'''$val);  
  150.        // straight replacements, the user should never need these since they're normal characters  
  151.        // this prevents like <IMG SRC=@avascript:alert('XSS')>  
  152.        $search = 'abcdefghijklmnopqrstuvwxyz';  
  153.        $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';  
  154.        $search .= '1234567890!@#$%^&*()';  
  155.        $search .= '~`";:?+/={}[]-_|'';  
  156.        for ($i = 0; $i < strlen($search); $i++) {  
  157.            // ;? matches the ;, which is optional  
  158.            // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars  
  159.            // @ @ search for the hex values  
  160.            $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i'$search[$i], $val);//with a ;  
  161.            // @ @ 0{0,7} matches '0' zero to seven times  
  162.            $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/'$search[$i], $val); // with a ;  
  163.        }  
  164.        // now the only remaining whitespace attacks are , , and   
  165.        $ra1 = Array('javascript''vbscript''expression''applet''meta''xml''blink''link''style''script''embed''object''iframe''frame''frameset''ilayer''layer''bgsound''title''base');  
  166.        $ra2 = Array('onabort''onactivate''onafterprint''onafterupdate''onbeforeactivate''onbeforecopy''onbeforecut''onbeforedeactivate''onbeforeeditfocus''onbeforepaste''onbeforeprint''onbeforeunload''onbeforeupdate''onblur''onbounce''oncellchange''onchange''onclick''oncontextmenu''oncontrolselect''oncopy''oncut''ondataavailable''ondatasetchanged''ondatasetcomplete''ondblclick''ondeactivate''ondrag''ondragend''ondragenter''ondragleave''ondragover''ondragstart''ondrop''onerror''onerrorupdate''onfilterchange''onfinish''onfocus''onfocusin''onfocusout''onhelp''onkeydown''onkeypress''onkeyup''onlayoutcomplete''onload''onlosecapture''onmousedown''onmouseenter''onmouseleave''onmousemove''onmouseout''onmouseover''onmouseup''onmousewheel''onmove''onmoveend''onmovestart''onpaste''onpropertychange''onreadystatechange''onreset''onresize''onresizeend''onresizestart''onrowenter''onrowexit''onrowsdelete''onrowsinserted''onscroll''onselect''onselectionchange''onselectstart''onstart''onstop''onsubmit''onunload');  
  167.        $ra = array_merge($ra1$ra2);  
  168.        $found = true; // keep replacing as long as the previous round replaced something  
  169.        while ($found == true) {  
  170.            $val_before = $val;  
  171.            for ($i = 0; $i < sizeof($ra); $i++) {  
  172.                $pattern = '/';  
  173.                for ($j = 0; $j < strlen($ra[$i]); $j++) {  
  174.                    if ($j > 0) {  
  175.                        $pattern .= '(';  
  176.                        $pattern .= '(&#[xX]0{0,8}([9ab]);)';  
  177.                        $pattern .= '|';  
  178.                        $pattern .= '|(&#0{0,8}([9|10|13]);)';  
  179.                        $pattern .= ')*';  
  180.                    }  
  181.                    $pattern .= $ra[$i][$j];  
  182.                }  
  183.                $pattern .= '/i';  
  184.                $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag  
  185.                $val = preg_replace($pattern$replacement$val); // filter out the hex tags  
  186.                if ($val_before == $val) {  
  187.                    // no replacements were made, so exit the loop  
  188.                    $found = false;  
  189.                }  
  190.            } //开源代码phpfensi.com 
  191.        }  
  192.        return $val;  
  193.     } 
  194.     ?> 

Tags: str_replace PHP函数防注入

分享到: