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 执行系统外部命令 system() exec() passthru()
Aug 11 PHP
php 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
php上传文件的增强函数
Jul 21 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
Sep 23 PHP
javascript数组与php数组的地址传递及值传递用法实例
Jan 22 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
Nov 25 PHP
php ajax实现文件上传进度条
Mar 29 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
php对象工厂类完整示例
Aug 09 PHP
PHP反射基础知识回顾
Sep 10 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
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
PHP中file_get_contents高?用法实例
2014/09/24 PHP
json简单介绍
2008/06/10 Javascript
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
Prototype Array对象 学习
2009/07/19 Javascript
Javascript 面向对象 重载
2010/05/13 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
[02:17]DOTA2亚洲邀请赛 RAVE战队出场宣传片
2015/02/07 DOTA
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
Python3如何解决字符编码问题详解
2017/04/23 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
python获取Linux发行版名称
2019/08/30 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
python实现遍历文件夹图片并重命名
2020/03/23 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
工程管理专业个人求职信范文
2013/12/07 职场文书
爱心倡议书范文
2014/05/12 职场文书
运动会口号大全
2014/06/07 职场文书
班干部学习委员竞选稿
2015/11/20 职场文书