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 相关文章推荐
通过ICQ网关发送手机短信的PHP源程序
Oct 09 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
php创建基本身份认证站点的方法详解
Jun 08 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
php 判断是否是中文/英文/数字示例代码
Sep 30 PHP
ThinkPHP中的系统常量和预定义常量集合
Jul 01 PHP
php开发微信支付获取用户地址
Oct 04 PHP
大家都应该掌握的PHP关联数组使用技巧
Dec 25 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
Oct 15 PHP
ThinkPHP5.1验证码功能实现的示例代码
Jun 08 PHP
php 解析非标准json、非规范json
Apr 01 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中将数组转成XML格式的实现代码
2011/08/08 PHP
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
jquery动态加载图片数据练习代码
2011/08/04 Javascript
js查错流程归纳
2012/05/04 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
2014/09/17 Javascript
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
Python检测QQ在线状态的方法
2015/05/09 Python
python读写ini配置文件方法实例分析
2015/06/30 Python
Python的string模块中的Template类字符串模板用法
2016/06/27 Python
python实现实时监控文件的方法
2016/08/26 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
Python玩转Excel的读写改实例
2019/02/22 Python
Pyqt5实现英文学习词典
2019/06/24 Python
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
毕业论文指导教师评语
2014/12/30 职场文书
英文版辞职信
2015/02/28 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书