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 相关文章推荐
实例(Smarty+FCKeditor新闻系统)
Jan 02 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
Aug 01 PHP
PHP5中新增stdClass 内部保留类
Jun 13 PHP
php 获取本地IP代码
Jun 23 PHP
thinkphp普通查询与表达式查询实例分析
Nov 24 PHP
THINKPHP2.0到3.0有哪些改进之处
Jan 04 PHP
PHP使用递归生成文章树
Apr 21 PHP
php创建无限级树型菜单
Nov 05 PHP
用PHP写的一个冒泡排序法的函数简单实例
May 26 PHP
PHP结合Ueditor并修改图片上传路径
Oct 16 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 PHP
laravel与thinkphp之间的区别与优缺点
Mar 02 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
php 在文件指定行插入数据的代码
2010/05/08 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
ES6 Symbol数据类型的应用实例分析
2019/06/26 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
python操作mysql代码总结
2018/06/01 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
Python 实现简单的客户端认证
2020/07/29 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
培训自我鉴定
2014/01/31 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
搞笑的获奖感言
2014/08/16 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
教师岗位说明书
2015/09/30 职场文书
高三数学复习备考教学反思
2016/02/18 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
A22国内电台短波广播频率表
2022/05/10 无线电