xss详情

839 阅读2分钟

xss攻击流程

  1. 往网页里注入脚本代码
  2. 当用户访问时获取到包含恶意代码的网页
  3. 通过恶意脚本,坏人可获取和控制用户信息

攻击方式

  1. 反射形状(非持久形攻击) XSS
  2. 储存性(持久形攻击) xss
  3. Dom-based形 XSS

反射型 vs 持久型

      非持久化            持久化
    需要用户点击    不需要交互也可以触发

Dom-Based 型

    基于浏览器Dom解析的攻击

1.反射型攻击流程

2.持久型攻击流程

3.Dom-Based 型攻击流程

反射型 vs Dom-Based 型攻击流程

    相同之处 优势用户访问包含恶意代码的URL
    不同之处 反射型需要服务端参与解析  Dome-Based 客户端参与解析

XSS防御策略

有些浏览器内置了XSS防御 把URL的恶意代码过滤了

1. httpOnly

    禁止JS访问cooke 
    当收到XSS攻击时减少受到的伤害

2. 输入检查

前端可绕过输入检查,服务端结合前端实现

    判断输入格式是否正确                              - 白名单
    过滤危险字符 去除<script>,<javascript,onclick>等  - 黑名单  filter()
    转义特殊字符 <&lt >&gt                            - 黑名单  htmlEscape()

3. 输出检查

最后一道防线,根据不同的场景对数据进行处理

    1. html  htmlEncode()
    2. javaScript javaScriptEncode()
    3. URL 内置 EncodeURI

输出检查的方法

1. 转义html特殊字符

// 转义 html 特殊字符
function htmlEscape(str) {
    return String(str)
        .replace(/&/g, '&amp;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#39;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;');
}

2.对富文本进行过滤处理

    // 正则获取危险标签
    var REGEXP_TAG = /<(script|style|iframe)[^<>]*?>.*?<\/\1>/ig;
    // 正则获取危险标签属性
    var REGEXP_ATTR_NAME = /(onerror|onclick)=([\"\']?)([^\"\'>]*?)\2/ig;
    
    /**
     * 过滤函数
     * @param {String} str
     */
    function filter(str) {
      return String(str)
        .replace(REGEXP_TAG, '')
        .replace(REGEXP_ATTR_NAME, '');
    }

输入检查的方法

1. 转义html特殊字符

    // 转义 html 特殊字符
function htmlEncode(str){
    return String(str)
        .replace(/&/g, '&amp;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#39;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;');
}

2. javaScript特殊字符进行转义

      // 通常是使用"\"对特殊字符进行转义
      function javaScriptEncode(str){
          function encodeCharx(original){
              var thecharchar = original.charAt(0);
              switch(thecharchar){
                  case '\n':return "\\n"; break;
                  case '\r':return "\\r"; break;
                  case '\'':return "\\'"; break;
                  case '\"':return "\\x22"; break;
                  case '\&':return "\\&"; break;
                  case '\\':return "\\\\"; break;
                  case '\t':return "\\t"; break;
                  case '/':return "\\x2F"; break;
                  case '<':return "\\x3C"; break;
                  case '>':return "\\x3E"; break;
                  default: return thecharchar;
            }
        }
        var preescape = str;
        var escaped = "";
        for(var i=0;i < preescape.length; i++){
            escaped = escaped + encodeCharx(preescape.charAt(i));
        }
        return escaped;
    }

3. URL特殊字符进行转义

浏览器内置 encodeURI()