1.5 xss漏洞修复

1.XSS漏洞修复

从上面XSS实例以及以前文章的介绍咱们知道XSS漏洞的原由就是没有对用户提交的数据进行严格的过滤处理。所以在思考解决XSS漏洞的时候,咱们应该重点把握如何才能更好的将用户提交的数据进行安全过滤。

  html实体

             什么是html实体?
        在html中有些字符,像(<)这类的,对HTML(标准通用标记语言下的一个应用)来讲是有特殊意义的,因此这些字符是不容许在文本中使用的。要在HTML中显示(<)这个字符,咱们就必须使用实体字符。
        html实体的存在是致使XSS漏洞的主要缘由之一。
       所以咱们须要将这些实体所有转换为相应的实体编号。
显示结果
描述
实体名称
 
空格
&nbsp;
小于号
&lt;
大于号
&gt;
&
和号
&amp;
"
引号
&quot;
'
撇号 
&apos; (IE不支持)
 

     HTML Encode

             用户将数据提交上来的时候进行HTML编码,将相应的符号转换为实体名称再进行下一步的处理。
             在PHP中已经存在这样子功能的函数,便是htmlentities($str)函数。
            与之相反的就是html_entity_decode($str)函数,它将实体名称转换为相应的符号。
 

  修复漏洞方针

        【不相应用户提交的数据,过滤过滤过滤!
          一、将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到 cookie了.
          二、表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合。。。。
          四、对数据进行Html Encode 处理
          五、过滤或移除特殊的Html标签, 例如: <script>, <iframe> , &lt; for <, &gt; for >, &quot for
          六、过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。
【特别注意:】
在有些应用中是容许html标签出现的,甚至是javascript代码出现。所以咱们在过滤数据的时候须要仔细分析哪些数据是有特殊要求(例如输出须要html代码、javascript代码拼接、或者此表单直接容许使用等等),而后区别处理!

  PHP中的相应函数

【详细看PHP手册】
这里可能不全,想了解更多的看手册
 
strip_tags($str, [容许标签])  
从字符串中去除 HTML 和 PHP 标记
htmlentities($str)
转义html实体
html_entity_decode($str)
反转义html实体
addcslashes($str, ‘字符’)
给某些字符加上反斜杠
stripcslashes($str)
去掉反斜杠
addslashes ($str )
单引号、双引号、反斜线与 NULL加反斜杠
stripslashes($str)
去掉反斜杠
htmlspecialchars()
特殊字符转换为HTML实体
htmlspecialchars_decode()  
将特殊的 HTML 实体转换回普通字符
 

  数据过滤类

 

<?php class XSS { /** * @desc 过滤数据 * * @param $data string|array 输入数据 * @param $low bool 是否采用更为严格的过滤 * * @return 返回过滤的数据 */
    public function clean_xss($data, $low = False) { #字符串过滤 if (! is_array ( $data )) { $data = trim ( $data ); #字符两边的处理 $data = strip_tags ( $data ); #从字符串中去除 HTML 和 PHP 标记 $data = htmlspecialchars ( $data ); #特殊字符转换为HTML实体 if ($low) { return $data; } #匹配换空格 $data = str_replace ( array ('"', "\\", "'", "/", "..", "../", "./", "//" ), '', $data ); $no = '/%0[0-8bcef]/'; $data = preg_replace ( $no, '', $data ); $no = '/%1[0-9a-f]/'; $data = preg_replace ( $no, '', $data ); $no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; $data = preg_replace ( $no, '', $data ); return $data; } #数组过滤 $arr=array(); foreach ($data as $k => $v) { $temp=$this->clean_xss($v); $arr[$k]=$temp; } return $arr; } } #测试测试 session_start(); $_SESSION['xss']='xssss'; $xss=new XSS(); #测试字符串 $str = "<script>alert(document.cookie)</script>"; echo $str; $str2=$xss->clean_xss($str); echo $str2; echo "<hr/>"; #测试数组 $arr=array("<script>alert(document.cookie)</script>","<script>alert(document.cookie)</script>","<script>alert(document.cookie)</script>"); echo "<pre>"; print_r($arr); echo "</pre>"; $arr2=$xss->clean_xss($arr); echo "<pre>"; print_r($arr2); echo "</pre>";die; ?>
相关文章
相关标签/搜索