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 相关文章推荐
PHP 无限分类三种方式 非函数的递归调用!
Aug 26 PHP
PHP获取用户的浏览器与操作系统信息的代码
Sep 04 PHP
将php数组输出html表格的方法
Feb 24 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
PHP获取数组最后一个值的2种方法
Jan 21 PHP
Codeigniter控制器controller继承问题实例分析
Jan 19 PHP
PHP模板引擎Smarty中变量的使用方法示例
Apr 11 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
Aug 02 PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 PHP
Laravel框架使用Redis的方法详解
May 30 PHP
asp函数split()对应php函数explode()
Feb 27 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初学者头疼问题总结
2006/07/08 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
关于尾递归的使用详解
2013/05/02 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
完美的php分页类
2017/10/24 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
jQuery设置和获取HTML、文本和值示例
2014/07/08 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
js实现九宫格的随机颜色跳转
2017/02/19 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
python调用API接口实现登陆短信验证
2020/05/10 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
Python获取指定网段正在使用的IP
2020/12/14 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
一体化教学实施方案
2014/05/10 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
查摆问题自查报告范文
2014/10/13 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
雷锋的故事观后感
2015/06/10 职场文书
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers