zoukankan      html  css  js  c++  java
  • 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)函数,它将实体名称转换为相应的符号。
     

      修复漏洞方针

            【不相应用户提交的数据,过滤过滤过滤!
              1、将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到 cookie了.
              2、表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合。。。。
              4、对数据进行Html Encode 处理
              5、过滤或移除特殊的Html标签, 例如: <script>, <iframe> , &lt; for <, &gt; for >, &quot for
              6、过滤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-x08x0Bx0Cx0E-x1Fx7F]+/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;
    ?>
  • 相关阅读:
    pip遇见的format问题
    opencv配置
    WPF学习笔记2
    WPF笔记1 用VS2015创建WPF程序
    C#基础知识
    电脑中毒了。
    感觉又学到了不少,在这里写下来,但也有一个问题,不知道是为甚吗?
    通过对HTML有一定的了解后,现在我开始学HTML DOM了。
    此情可待成追忆,只是当时已惘然。
    常用PS快捷键
  • 原文地址:https://www.cnblogs.com/bmjoker/p/8806899.html
Copyright © 2011-2022 走看看