XSS跨站脚本攻击

1、简介

XSS(cross site script)是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某种动做或者对访问者进行病毒侵害的一种攻击方式。javascript

XSS是一种常常出如今web应用中的计算机安全漏洞,也是web中最主流的攻击方式。html

2、缘由解析

主要缘由:过于信任客户端提交的数据,客户端提交的数据原本就是应用所须要的,可是恶意攻击者利用网站对客户端提交数据的信任,在数据中插入一些符号以及javascript代码,那么这些数据将会成为应用代码中的一部分了。那么攻击者就能够肆无忌惮地展开攻击啦。vue

解决办法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理而后方可进行下一步的操做。java

3、XSS攻击分类

一、反射型XSS

又称为非持久性跨站点脚本攻击,它是最多见的类型的XSS。漏洞产生的缘由是攻击者注入的数据反映在响应中。一个典型的非持久性XSS包含一个带XSS攻击向量的连接(即每次攻击须要用户的点击)。git

二、存储型XSS

又称为持久型跨站点脚本,它通常发生在XSS攻击向量(通常指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久性XSS攻击危害性更大,由于每当用户打开页面,查看内容时脚本将自动执行。github

三、DOM Based XSS

当用户可以经过交互修改浏览器页面中的DOM并显示在浏览器上时,就有可能产生这种漏洞,从效果上来讲它也是反射型XSS。经过修改页面的DOM节点造成的XSS,称之为DOMBasedXSS。web

容易致使DOM型的XSS的输入源包括:
Document.URL
Document.referrer
Document.cookie
Window.name
Location.[pathname|href|search|hash]
localStorage/globalStorage数据库

3、XSS攻击

  1. 绕过XSS-Filter,利用 <> 标签注入 HTML/JavaScript 代码;
  2. 利用HTML标签的属性值进行XSS攻击。例如:<img src=“javascript:alert(‘xss’)”/>;(固然并非全部的Web浏览器都支持Javascript伪协议,因此此类 XSS 攻击具备必定的局限性)
  3. 空格、回车和Tab。若是XSS Filter仅仅将敏感的输入字符列入黑名单,好比javascript,用户能够利用空格、回车和Tab键来绕过过滤,例如:<img src=“javas cript:alert(/xss/);”/>;
  4. 利用事件来执行跨站脚本。例如:<img src=“#” onerror= “alert(1)”/>,当src错误,就会执行onerror事件;
  5. 利用CSS跨站。例如:body {backgrund-image: url(“javascript:alert(‘xss’)”)};
  6. 扰乱过滤规则。例如:<IMG SRC=“javaSCript: alert(/xss/);”/>;
  7. 利用字符编码,经过这种技巧,不只能让XSS代码绕过服务端的过滤,还能更好地隐藏Shellcode;(JS支持unicode、eacapes、十六进制、十进制等编码形式);
  8. 拆分跨站法,将XSS攻击的代码拆分开来,适用于应用程序没有过滤XSS关键字符(如<、>)却对输入字符长度有限制的状况下;
  9. DOM型XSS主要是由客户端的脚本经过DOM动态地输出数据到页面上,它不依赖于提交数据到服务器,而是从客户端得到DOM中的数据在本地执行。

4、XSS防护措施

一、使用 XSS Filter

针对用户提交的数据进行有效的验证,只接受咱们规定的长度或内容的提交,过滤掉其余的输入内容。好比:segmentfault

  • 表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。
  • 过滤或移除特殊的 html 标签:<script>、<iframe>等。
  • 过滤 js 事件的标签:onclick、onerror、onfocus等。

二、HTML编码

对用户输入的数据进行HTML Entity编码 。浏览器

字符 十进制 转义字符
" &#34; &quot;
& &#38; &amp;
< &#60; &lt;
> &#62; &gt;
空格 &#160; &nbsp;

三、JavaScript编码

使用“”对特殊字符进行转义,除数字字母以外,小于127使用16进制“xHH”的方式进行编码,大于用unicode.

这条原则主要针对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(如onerror, onload等)。在往JavaScript代码里插入数据的时候,只有一种状况是安全的,那就是对不可信数据进行JavaScript编码,而且只把这些数据放到使用引号包围起来的值部分(data value)之中。

注意:在对不可信数据作编码的时候,不能图方便使用反斜杠 对特殊字符进行简单转义,好比将双引号 " 转义成 " ,这样作是不可靠的,由于浏览器在对页面作解析的时候,会先进行HTML解析,而后才是JavaScript解析,因此双引号极可能会被当作HTML字符进行HTML解析,这时双引号就能够突破代码的值部分,使得攻击者能够继续进行XSS攻击;另外,输出的变量的时候,变量值必须在引号内部,避免安全问题;更加严格的方式,对除了数字和字母之外的全部字符,使用十六进制xhh 的方式进行编码。

四、其余

  1. 将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
  2. 对数据进行Encode 处理
  3. CSP: Content-Security-Policy(内容安全策略)

    <meta http-equiv="Content-Security-Policy" content="xxxxxxxxxx">

五、代码

/**
 * 使用:引入: import base from '../../../../vv-base/vue/base.js'
         调用: base.toUrl('http://www.baidu.com')
 */
const base={
     /**
     * 内容转义
     * eg: 使用v-html时,进行转义
     */
     toHtml(val) {
        var entityMap = {
            "&": "&amp;",
            "<": "&lt;",
            ">": "&gt;",
            '"': '&quot;',
            "'": '&#39;',
            "/": '&#x2F;'
        };
        return String(val).replace(/[&<>"'\/]/g, function (s) {
            return entityMap[s];
        });
    },
    /**
     * a标签中的href属性值转义
     * eg: <a :href="base.toUrl(url)"></a>
     */
    toUrl(url) {
        if(url.match(/^http/i)){
            return encodeURI(url)
        }
        return '#'
    }
}
export default base;

5、参考

根据白名单过滤 HTML(防止 XSS 攻击)
XSS Filter Evasion Cheat Sheet 中文版
https://segmentfault.com/a/11...

相关文章
相关标签/搜索