php过滤XSS攻击的函数


Posted in PHP onNovember 12, 2013

下面的函数可以用来过滤用户的输入,保证输入是XSS安全的。具体如何过滤,可以参看函数内部,也有注释。

<?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 <java\0script>  
   // note that you have to handle splits with \n, \r, and \t 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 \t, \n, and \r 
   $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 相关文章推荐
xml在joomla表单中的应用详解分享
Jul 19 PHP
PHP数组传递是值传递而非引用传递概念纠正
Jan 31 PHP
CodeIgniter中使用cookie的三种方式详解
Jul 18 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
Apr 17 PHP
HTML中嵌入PHP的简单方法
Feb 16 PHP
PHP实现基于mysqli的Model基类完整实例
Apr 08 PHP
JavaScript实现删除电脑的关机键
Jul 26 PHP
PHP中explode函数和split函数的区别小结
Aug 24 PHP
PHP 500报错的快速解决方法
Dec 14 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
May 23 PHP
基于Laravel 5.2 regex验证的正确写法
Sep 29 PHP
php获取新浪微博数据API实例
Nov 12 #PHP
php生成N个不重复的随机数实例
Nov 12 #PHP
三种php连接access数据库方法
Nov 11 #PHP
PHP中ob_start函数的使用说明
Nov 11 #PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
Nov 11 #PHP
PHP利用str_replace防注入的方法
Nov 10 #PHP
PHP加密扩展库Mcrypt安装和实例
Nov 10 #PHP
You might like
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
2018/08/19 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
Python中的pprint折腾记
2015/01/21 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
Python 3中的yield from语法详解
2017/01/18 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
Python random模块制作简易的四位数验证码
2020/02/01 Python
基于python实现地址和经纬度转换
2020/05/19 Python
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
派出所所长先进事迹
2014/05/19 职场文书
倡导文明标语
2014/06/16 职场文书
2016年寒假家长评语
2015/10/10 职场文书
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python