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中的Class的几点个人看法
Oct 09 PHP
PHP写入WRITE编码为UTF8的文件的实现代码
Jul 07 PHP
PHP 第三节 变量介绍
Apr 28 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
May 29 PHP
php常用字符串比较函数实例汇总
Nov 24 PHP
php中实现xml与mysql数据相互转换的方法
Dec 25 PHP
通过php修改xml文档内容的方法
Jan 23 PHP
Zend Framework教程之Bootstrap类用法概述
Mar 14 PHP
PHP实现合并两个排序链表的方法
Jan 19 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 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中使用与Perl兼容的正则表达式
2006/11/26 PHP
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
php输出形式实例整理
2020/05/05 PHP
SeaJS入门教程系列之SeaJS介绍(一)
2014/03/03 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
2017/05/11 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
ES6箭头函数和扩展实例分析
2020/05/23 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
python 函数传参之传值还是传引用的分析
2017/09/07 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
如何使用python进行pdf文件分割
2019/11/11 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
2020/06/11 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
python实现移动木板小游戏
2020/10/09 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
老师对学生的寄语
2014/04/09 职场文书
优秀护士演讲稿
2014/04/30 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
2014年体育工作总结
2014/11/24 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
婚内分居协议书范文
2014/11/26 职场文书
企业宣传稿范文
2015/07/23 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang