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网页后退不再出现过期
Mar 08 PHP
php框架Phpbean说明
Jan 10 PHP
discuz加密解密函数使用方法和中文注释
Jan 21 PHP
PHP获取时间排除周六、周日的两个方法
Jun 30 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 PHP
ThinkPHP自动填充实现无限级分类的方法
Aug 22 PHP
PHP类的封装与继承详解
Sep 29 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
ThinkPHP使用Ueditor的方法详解
May 20 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
详解php curl带有csrf-token验证模拟提交方法
Apr 18 PHP
php实现数字补零的方法总结
Sep 12 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防止跨域提交表单
2013/11/01 PHP
ThinkPHP之getField详解
2014/06/20 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
[35:55]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.11
2020/12/13 DOTA
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
优秀团支部事迹材料
2014/02/08 职场文书
五一手机促销方案
2014/03/08 职场文书
欢迎领导标语
2014/06/27 职场文书
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript
python实现简单聊天功能
2021/07/07 Python
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS