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 相关文章推荐
一个没有MYSQL数据库支持的简易留言本的编写
Oct 09 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
May 19 PHP
php daddslashes()和 saddslashes()有哪些区别分析
Oct 26 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 PHP
PHP速成大法
Jan 30 PHP
PHP 使用memcached简单示例分享
Mar 05 PHP
Yii操作数据库实现动态获取表名的方法
Mar 29 PHP
PHP中单例模式与工厂模式详解
Feb 17 PHP
PHP命名空间namespace及use的简单用法分析
Aug 03 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 PHP
php 中的信号处理操作实例详解
Mar 04 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
PR值查询 | PageRank 查询
2006/12/20 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
VBScript版代码高亮
2006/06/26 Javascript
简单三步,搞掂内存泄漏
2007/03/10 Javascript
javascript 自动转到命名锚记
2009/01/10 Javascript
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
layui 弹出层回调获取弹出层数据的例子
2019/09/02 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
实例讲解Python3中abs()函数
2019/02/19 Python
python实现维吉尼亚加密法
2019/03/20 Python
Python实现Restful API的例子
2019/08/31 Python
python属于跨平台语言码
2020/06/09 Python
python使用selenium爬虫知乎的方法示例
2020/10/28 Python
苹果香港官方商城:Apple香港
2016/09/14 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
食品营养与检测应届生求职信
2013/11/08 职场文书
运动员口号
2014/06/09 职场文书
贷款承诺书
2015/01/20 职场文书
工程技术员岗位职责
2015/04/11 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL
移除Selenium中window.navigator.webdriver值
2022/06/10 Python
mysql序号rownum行号实现方式
2022/12/24 MySQL