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 相关文章推荐
一个odbc连mssql分页的类
Oct 09 PHP
PHP 和 XML: 使用expat函数(三)
Oct 09 PHP
PHP获得用户使用的代理服务器ip即真实ip
Dec 31 PHP
php实现的返回数据格式化类实例
Sep 22 PHP
PHP+MySQL插入操作实例
Jan 21 PHP
PHP+APACHE实现网址伪静态
Feb 22 PHP
Centos6.5和Centos7 php环境搭建方法
May 27 PHP
PHP7匿名类用法分析
Sep 26 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
Aug 15 PHP
PHP文件操作实例总结【文件上传、下载、分页】
Dec 08 PHP
php解决crontab定时任务不能写入文件问题的方法分析
Sep 16 PHP
基于PHP的微信公众号的开发流程详解
Aug 07 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自定义的格式化时间示例代码
2013/12/05 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
自己的js工具 Event封装
2009/08/21 Javascript
ExtJs的Date格式字符代码
2010/12/30 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
基于jquery的时间段实现代码
2012/08/02 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
js与C#进行时间戳转换
2014/11/14 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
js中开关变量使用实例
2017/02/24 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
[02:44]完美大师赛主赛事淘汰赛第二日观众采访
2017/11/24 DOTA
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python模拟登录12306的方法
2014/12/30 Python
python中的装饰器详解
2015/04/13 Python
简单谈谈python中的Queue与多进程
2016/08/25 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
优秀教师演讲稿
2014/05/06 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
写给老师的保证书
2015/05/09 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
党员公开承诺书2016
2016/03/24 职场文书