php实现XSS安全过滤的方法


Posted in PHP onJuly 29, 2015

本文实例讲述了php实现XSS安全过滤的方法。分享给大家供大家参考。具体如下:

function remove_xss($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程序设计有所帮助。

PHP 相关文章推荐
PHP 遍历XP文件夹下所有文件
Nov 27 PHP
ajax php 实现写入数据库
Sep 02 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
php算法实例分享
Jul 14 PHP
ThinkPHP项目分组配置方法分析
Mar 23 PHP
PHP实现的常规正则验证helper公共类完整实例
Apr 27 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
PHP集成环境XAMPP的安装与配置
Nov 13 PHP
tp5框架内使用tp3.2分页的方法分析
May 05 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
解决PhpStorm64不能启动的问题
Jun 20 PHP
php检查字符串中是否有外链的方法
Jul 29 #PHP
php数组比较实现查找连续数的方法
Jul 29 #PHP
PHP实现XML与数据格式进行转换类实例
Jul 29 #PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 #PHP
discuz图片顺序混乱解决方案
Jul 29 #PHP
php计算title标题相似比的方法
Jul 29 #PHP
PHP实现简单实用的验证码类
Jul 29 #PHP
You might like
MYSQL数据库初学者使用指南
2006/11/16 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
php过滤敏感词的示例
2014/03/31 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
2012/08/14 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
Python中为什么要用self探讨
2015/04/14 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
利用Python查看目录中的文件示例详解
2017/08/28 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
python3.7 sys模块的具体使用
2019/07/22 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
年终考核实施方案
2014/05/26 职场文书
2014国庆节演讲稿:祖国在我心中(400字)
2014/09/25 职场文书
企业法人授权委托书
2014/09/25 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
小石潭记导游词
2015/02/03 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
信用卡催款律师函
2015/05/27 职场文书