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 相关文章推荐
建立动态的WML站点(三)
Oct 09 PHP
Fine Uploader文件上传组件应用介绍
Jan 06 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
php字符串截取函数用法分析
Nov 25 PHP
讲解WordPress开发中一些常用的debug技巧
Dec 18 PHP
PHP表单数据写入MySQL数据库的代码
May 31 PHP
PHPStrom 新建FTP项目以及在线操作教程
Oct 16 PHP
PHP编程计算日期间隔天数的方法
Apr 26 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 PHP
PHP调用API接口实现天气查询功能的示例
Sep 21 PHP
PHP attributes()函数讲解
Feb 03 PHP
PHP的垃圾回收机制代码实例讲解
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中使用Oracle数据库(2)
2006/10/09 PHP
PHP常见数组函数用法小结
2016/03/21 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
JavaScript使用prototype定义对象类型(转)[
2006/12/22 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
关于element的表单组件整理笔记
2021/02/05 Javascript
python3使用tkinter实现ui界面简单实例
2014/01/10 Python
python的else子句使用指南
2016/02/27 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
video实现有声音自动播放的实现方法
2020/05/20 HTML / CSS
Java多态性的定义以及类型
2014/09/16 面试题
护理专业的自荐信
2013/10/22 职场文书
应用英语专业自荐信
2014/01/26 职场文书
青奥会口号
2014/06/12 职场文书
酒店前台接待岗位职责
2015/04/02 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书
react如何快速设置文件路径别名
2021/04/28 Javascript
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
MySQL RC事务隔离的实现
2022/03/31 MySQL
Java数组详细介绍及相关工具类
2022/04/14 Java/Android