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 相关文章推荐
JAVA/JSP学习系列之六
Oct 09 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
Sep 08 PHP
PHP COOKIE设置为浏览器进程
Jun 21 PHP
php mysql 判断update之后是否更新了的方法
Jan 10 PHP
PHP测试程序运行时间的类
Feb 05 PHP
单点登录 Ucenter示例分析
Oct 29 PHP
php实现的美国50个州选择列表实例
Apr 20 PHP
php示例详解Constructor Prototype Pattern 原型模式
Oct 15 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
PHP实现提取多维数组指定一列的方法总结
Dec 04 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
Mar 09 PHP
php实例化对象的实例方法
Nov 17 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排序算法(冒泡排序,快速排序)
2012/10/09 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
利用PHP实现短域名互转
2013/07/05 PHP
php mail to 配置详解
2014/01/16 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
easyui validatebox验证
2016/04/29 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
微信小程序 页面跳转事件绑定的实例详解
2017/09/20 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
Python 爬虫的工具列表大全
2016/01/31 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
Django异步任务线程池实现原理
2019/12/17 Python
python计算二维矩形IOU实例
2020/01/18 Python
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
学生会部长竞聘书
2014/03/31 职场文书
电教室标语
2014/06/20 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
营业用房租赁协议书
2014/11/26 职场文书
高中生军训感言
2015/08/01 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js