php实现XSS安全过滤的方法


Posted in PHP onJuly 29, 2015

本文实例讲述了php实现XSS安全过滤的方法。分享给大家供大家参考。具体如下:

function remove_xss($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 相关文章推荐
PHP树的代码,可以嵌套任意层
Oct 09 PHP
一个简易需要注册的留言版程序
Oct 09 PHP
php minixml详解
Jul 19 PHP
Windows PHP5和Apache的安装与配置
Jun 08 PHP
php数组去重的函数代码
Feb 03 PHP
PHP5函数小全(分享)
Jun 06 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
Nov 18 PHP
PHP7数组的底层实现示例
Aug 25 PHP
PHP中类与对象功能、用法实例解读
Mar 27 PHP
Laravel Reponse响应客户端示例详解
Sep 03 PHP
PHP正则表达式之RCEService回溯
Apr 11 PHP
php检查字符串中是否有外链的方法
Jul 29 #PHP
php数组比较实现查找连续数的方法
Jul 29 #PHP
PHP实现XML与数据格式进行转换类实例
Jul 29 #PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 #PHP
discuz图片顺序混乱解决方案
Jul 29 #PHP
php计算title标题相似比的方法
Jul 29 #PHP
PHP实现简单实用的验证码类
Jul 29 #PHP
You might like
1.PHP简介
2006/10/09 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
2015/03/27 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
vue接口请求加密实例
2020/08/11 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
分析在Python中何种情况下需要使用断言
2015/04/01 Python
Python进阶篇之字典操作总结
2016/11/16 Python
Python元组常见操作示例
2019/02/19 Python
python如何实现代码检查
2019/06/28 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
美国在线家具网站:GDFStudio
2021/03/13 全球购物
环境工程毕业生自荐信
2013/11/17 职场文书
小学生元旦感言
2014/02/26 职场文书
安全教育演讲稿
2014/05/09 职场文书
法学院毕业生求职信
2014/06/25 职场文书
党的群众路线学习笔记
2014/11/06 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
统计员岗位职责
2015/02/11 职场文书
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers
「我的青春恋爱物语果然有问题。-妄言录-」第20卷封面公开
2022/03/21 日漫