php过滤XSS攻击的函数


Posted in PHP onNovember 12, 2013

下面的函数可以用来过滤用户的输入,保证输入是XSS安全的。具体如何过滤,可以参看函数内部,也有注释。

<?php
function RemoveXSS($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 相关文章推荐
PHP5 安装方法
Oct 09 PHP
5.PHP的其他功能
Oct 09 PHP
php中文字符串截取方法实例总结
Sep 30 PHP
php 伪造ip以及url来路信息方法汇总
Nov 25 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
Mar 18 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
Jun 10 PHP
discuz图片顺序混乱解决方案
Jul 29 PHP
PHP常见错误提示含义解释(实用!值得收藏)
Apr 25 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 24 PHP
php获取新浪微博数据API实例
Nov 12 #PHP
php生成N个不重复的随机数实例
Nov 12 #PHP
三种php连接access数据库方法
Nov 11 #PHP
PHP中ob_start函数的使用说明
Nov 11 #PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
Nov 11 #PHP
PHP利用str_replace防注入的方法
Nov 10 #PHP
PHP加密扩展库Mcrypt安装和实例
Nov 10 #PHP
You might like
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
取键盘键位ASCII码的网页
2007/07/30 Javascript
JavaScript修改css样式style
2008/04/15 Javascript
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
Vue中的v-cloak使用解读
2017/03/27 Javascript
php 修改密码实现代码
2017/05/24 Javascript
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
2019/01/18 jQuery
Jquery异步上传文件代码实例
2019/11/13 jQuery
纯js+css实现仿移动端淘宝网站的弹出详情框功能
2019/12/29 Javascript
使用python分析git log日志示例
2014/02/27 Python
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
python进程和线程用法知识点总结
2019/05/28 Python
浅谈Python大神都是这样处理XML文件的
2019/05/31 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
六十大寿答谢词
2014/01/12 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
警校毕业生自我评价
2014/04/06 职场文书
环保倡议书范文
2014/05/12 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
师范生自荐信模板
2014/05/28 职场文书
德育标兵事迹材料
2014/08/24 职场文书
2014年维稳工作总结
2014/11/18 职场文书
开会通知短信大全
2015/04/20 职场文书
首次购房证明
2015/06/19 职场文书
如何使用PyCharm及常用配置详解
2021/06/03 Python
Python字典和列表性能之间的比较
2021/06/07 Python