PHP利用str_replace防注入的方法


Posted in PHP onNovember 10, 2013

PHP各种过滤字符函数

   <?php
    /**
    * 安全过滤函数
    *
    * @param $string
    * @return string
    */
    function safe_replace($string) {
    $string = str_replace('%20','',$string);
    $string = str_replace('%27','',$string);
    $string = str_replace('%2527','',$string);
    $string = str_replace('*','',$string);
    $string = str_replace('"','"',$string);
    $string = str_replace("'",'',$string);
    $string = str_replace('"','',$string);
    $string = str_replace(';','',$string);
    $string = str_replace('<','<',$string);
    $string = str_replace('>','>',$string);
    $string = str_replace("{",'',$string);
    $string = str_replace('}','',$string);
    $string = str_replace('','',$string);
    return $string;
    }
    ?>

    <?php
    /**
    * 返回经addslashes处理过的字符串或数组
    * @param $string 需要处理的字符串或数组
    * @return mixed
    */
    function new_addslashes($string) {
    if(!is_array($string)) return addslashes($string);
    foreach($string as $key => $val) $string[$key] = new_addslashes($val);
    return $string;
    }
    ?>

    <?php
    //对请求的字符串进行安全处理
    /*
    $safestep
    0 为不处理,
    1 为禁止不安全HTML内容(javascript等),
    2 完全禁止HTML内容,并替换部份不安全字符串(如:eval(、union、CONCAT(、--、等)
    */
    function StringSafe($str, $safestep=-1){
    $safestep = ($safestep > -1) ? $safestep : 1;
    if($safestep == 1){
    $str = preg_replace("#script:#i", "script:", $str);
    $str = preg_replace("#<[/]{0,1}(link|meta|ifr|fra|scr)[^>]*>#isU", '', $str);
    $str = preg_replace("#[ ]{1,}#", ' ', $str);
    return $str;
    }else if($safestep == 2){
    $str = addslashes(htmlspecialchars(stripslashes($str)));
    $str = preg_replace("#eval#i", 'eval', $str);
    $str = preg_replace("#union#i", 'union', $str);
    $str = preg_replace("#concat#i", 'concat', $str);
    $str = preg_replace("#--#", '--', $str);
    $str = preg_replace("#[ ]{1,}#", ' ', $str);
    return $str;
    }else{
    return $str;
    }
    }
    ?>

    <?php
       /**
        +----------------------------------------------------------
        * 输出安全的html,用于过滤危险代码
        +----------------------------------------------------------
        * @access public
        +----------------------------------------------------------
        * @param string $text 要处理的字符串
        * @param mixed $tags 允许的标签列表,如 table|td|th|td
        +----------------------------------------------------------
        * @return string
        +----------------------------------------------------------
        */
       static public function safeHtml($text, $tags = null)
       {
           $text =  trim($text);
           //完全过滤注释
           $text = preg_replace('/<!--?.*-->/','',$text);
           //完全过滤动态代码
           $text =  preg_replace('/<?|?'.'>/','',$text);
           //完全过滤js
           $text = preg_replace('/<script?.*/script>/','',$text);
           $text =  str_replace('[','[',$text);
           $text = str_replace(']',']',$text);
           $text =  str_replace('|','|',$text);
           //过滤换行符
           $text = preg_replace('/ ? /','',$text);
           //br
           $text =  preg_replace('/<br(s/)?'.'>/i','[br]',$text);
           $text = preg_replace('/([br]s*){10,}/i','[br]',$text);
           //过滤危险的属性,如:过滤on事件lang js
           while(preg_match('/(<[^><]+)(lang|on|action|background|codebase|dynsrc|lowsrc)[^><]+/i',$text,$mat)){
               $text=str_replace($mat[0],$mat[1],$text);
           }
           while(preg_match('/(<[^><]+)(window.|javascript:|js:|about:|file:|document.|vbs:|cookie)([^><]*)/i',$text,$mat)){
               $text=str_replace($mat[0],$mat[1].$mat[3],$text);
           }
           if( empty($allowTags) ) { $allowTags = self::$htmlTags['allow']; }
           //允许的HTML标签
           $text =  preg_replace('/<('.$allowTags.')( [^><[]]*)>/i','[12]',$text);
           //过滤多余html
           if ( empty($banTag) ) { $banTag = self::$htmlTags['ban']; }
           $text =  preg_replace('/</?('.$banTag.')[^><]*>/i','',$text);
           //过滤合法的html标签
           while(preg_match('/<([a-z]+)[^><[]]*>[^><]*</1>/i',$text,$mat)){
               $text=str_replace($mat[0],str_replace('>',']',str_replace('<','[',$mat[0])),$text);
           }
           //转换引号
           while(preg_match('/([[^[]]*=s*)("|')([^2=[]]+)2([^[]]*])/i',$text,$mat)){
               $text=str_replace($mat[0],$mat[1].'|'.$mat[3].'|'.$mat[4],$text);
           }
           //空属性转换
           $text =  str_replace('''','||',$text);
           $text = str_replace('""','||',$text);
           //过滤错误的单个引号
           while(preg_match('/[[^[]]*("|')[^[]]*]/i',$text,$mat)){
               $text=str_replace($mat[0],str_replace($mat[1],'',$mat[0]),$text);
           }
           //转换其它所有不合法的 < >
           $text =  str_replace('<','<',$text);
           $text = str_replace('>','>',$text);
           $text = str_replace('"','"',$text);
           //反转换
           $text =  str_replace('[','<',$text);
           $text =  str_replace(']','>',$text);
           $text =  str_replace('|','"',$text);
           //过滤多余空格
           $text =  str_replace('  ',' ',$text);
           return $text;
       }
    ?>

    <?php
    function RemoveXSS($val) { 
       // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed 
       // this prevents some character re-spacing such as <javascript> 
       // note that you have to handle splits with , , and later since they *are* allowed in some          // inputs 
       $val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19])/', '', $val); 
       // straight replacements, the user should never need these since they're normal characters 
       // this prevents like <IMG SRC=@avascript:alert('XSS')> 
       $search = 'abcdefghijklmnopqrstuvwxyz'; 
       $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
       $search .= '1234567890!@#$%^&*()'; 
       $search .= '~`";:?+/={}[]-_|''; 
       for ($i = 0; $i < strlen($search); $i++) { 
           // ;? matches the ;, which is optional 
           // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars 
           // @ @ search for the hex values 
           $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val);//with a ; 
           // @ @ 0{0,7} matches '0' zero to seven times 
           $val = preg_replace('/(�{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ; 
       } 
       // now the only remaining whitespace attacks are , , and  
       $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base'); 
       $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'); 
       $ra = array_merge($ra1, $ra2); 
       $found = true; // keep replacing as long as the previous round replaced something 
       while ($found == true) { 
           $val_before = $val; 
           for ($i = 0; $i < sizeof($ra); $i++) { 
               $pattern = '/'; 
               for ($j = 0; $j < strlen($ra[$i]); $j++) { 
                   if ($j > 0) { 
                       $pattern .= '('; 
                       $pattern .= '(&#[xX]0{0,8}([9ab]);)'; 
                       $pattern .= '|'; 
                       $pattern .= '|(�{0,8}([9|10|13]);)'; 
                       $pattern .= ')*'; 
                   } 
                   $pattern .= $ra[$i][$j]; 
               } 
               $pattern .= '/i'; 
               $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag 
               $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags 
               if ($val_before == $val) { 
                   // no replacements were made, so exit the loop 
                   $found = false; 
               } 
           } 
       } 
       return $val; 
    }
    ?>
PHP 相关文章推荐
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
PHP 遍历文件实现代码
May 04 PHP
PHP与SQL注入攻击防范小技巧
Sep 16 PHP
php读取excel文件的简单实例
Aug 26 PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 PHP
php内存缓存实现方法
Jan 24 PHP
php实现TCP端口检测的方法
Apr 01 PHP
PHP实现的memcache环形队列类实例
Jul 28 PHP
PHP7.0安装笔记整理
Aug 28 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
laravel5.1 ajax post 传值_token示例
Oct 24 PHP
PHP tp5中使用原生sql查询代码实例
Oct 28 PHP
PHP加密扩展库Mcrypt安装和实例
Nov 10 #PHP
php中autoload的用法总结
Nov 08 #PHP
PHP用身份证号获取星座和生肖的方法
Nov 07 #PHP
php旋转图片90度的方法
Nov 07 #PHP
提高PHP编程效率的方法
Nov 07 #PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
Nov 07 #PHP
php获取汉字首字母的函数
Nov 07 #PHP
You might like
浅析php创建者模式
2014/11/25 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
OfflineSave离线保存代码再次发布使用说明
2007/05/23 Javascript
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
玩转方法:call和apply
2014/05/08 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
2015/09/17 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
深入理解JavaScript中的对象复制(Object Clone)
2016/05/18 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
python实现挑选出来100以内的质数
2015/03/24 Python
python中的字典操作及字典函数
2018/01/03 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
python os.path模块常用方法实例详解
2018/09/16 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
致铅球运动员广播稿精选
2014/01/12 职场文书
初中化学教学反思
2014/01/23 职场文书
语文教学随笔感言
2014/02/18 职场文书
英语教学随笔感言
2014/02/20 职场文书
奖金申请报告模板
2015/05/15 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
Nginx禁止ip访问或非法域名访问
2022/04/07 Servers
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript