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新手上路(二)
Oct 09 PHP
php 冒泡排序 交换排序法
May 10 PHP
php中模拟POST传递数据的两种方法分享
Sep 16 PHP
如何在php中正确的使用json
Aug 06 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
php实现的Captcha验证码类实例
Sep 22 PHP
用php守护另一个php进程的例子
Feb 13 PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
Linux下 php7安装redis的方法
Nov 01 PHP
PHP实现统计代码行数小工具
Sep 19 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
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
javascript cookies操作集合
2010/04/12 Javascript
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
Vue计算属性的使用
2017/08/04 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
Python爬取梨视频的示例
2021/01/29 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
什么是组件架构
2016/05/15 面试题
测控技术自荐信
2014/06/05 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
大学生自荐材料范文
2014/12/30 职场文书
锦旗赠语
2015/06/23 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python
JavaScript实现队列结构过程
2021/12/06 Javascript
MySQL创建定时任务
2022/01/22 MySQL
PYTHON InceptionV3模型的复现详解
2022/05/06 Python