XSS Escape chars

519 阅读3分钟

概述

XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌。

1. HTML elements(div、span...)

escape these chars: & < > " ' /

function escapeForHTML(str, kwargs){
    return ('' + str)
      .replace(/&/g, '&amp;')
      .replace(/</g, '&lt;')     // DEC=> &#60; HEX=> &#x3c; Entity=> &lt;
      .replace(/>/g, '&gt;')
      .replace(/"/g, '&quot;')
      .replace(/'/g, '&#x27;')   // &apos; 不推荐,因为它不在HTML规范中
      .replace(/\//g, '&#x2F;');
};

2. HTML Attribute (src、href、style)

use &#xHH; to escape all the chars of ASCII< 256

    function escapeForHTMLAttibute(str, kwargs){
        let encoded = '';
        for(let i = 0; i < str.length; i++) {
          let ch = hex = str[i];
          if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {
            hex = '&#x' + ch.charCodeAt(0).toString(16) + ';';
          }
          encoded += hex;
        }
        return encoded;
    };

3. JavaScirpt Code and Event handler

use \xHH to escape all the chars of ASCII< 256

    function escapeForJavascript(str, kwargs) {
        let encoded = '';
        for(let i = 0; i < str.length; i++) {
          let cc = hex = str[i];
          if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {
            hex = '\\x' + cc.charCodeAt().toString(16);
          }
          encoded += hex;
        }
        return encoded;
    };

4. URL params

    function escapeForURL(str, kwargs){
        return encodeURIComponent(str);
    };

5. CSS

use \XXXXXX to escape all the chars of ASCII< 256

    function escapeForCSS (attr, str, kwargs){
        let encoded = '';
        for (let i = 0; i < str.length; i++) {
          let ch = str.charAt(i);
          if (!ch.match(/[a-zA-Z0-9]/) {
            let hex = str.charCodeAt(i).toString(16);
            let pad = '000000'.substr((hex.length));
            encoded += '\\' + pad + hex;
          } else {
            encoded += ch;
          }
        }
        return encoded;
    };

React、Vue... already add XSS Escape

AngularJS

ng-bind

使用ng-bind指令转码HTML 你可以用ng-bind指令来转码整个网页。它将会转码所有HTML标签但是仍然显示本来的样子。

ng-bind-html

使用安全的方式插入HTML,也可以使用 ng-bind-html 指令忽略掉诸如“script”这样的元素

ng-bind-html 指令会计算表达式,并且用一种安全的方式将结果HTML插入元素中 下面这些都被包含进了安全列表中 (直接从源代码中获得):

  • 空元素: area,br,col,hr,img,wbr. 详细信息请访问 dev.w3.org/html5/spec/…
  • 块元素: address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul
  • 内联元素: a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var
  • 结尾标记元素: colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr,rp,rt. 详细信息请访问 dev.w3.org/html5/spec/…

下面的这两个元素 因为其内容不收信任,需要被规避掉. 在这种情况下,如果你想要展示它们,就要使用 $sce 服务,调用Angular 的 trustAsHtml 方法来执行下面提到的元素.

  • script
  • style

Linked doc: