XSS分类
XSS 攻击按攻击方式可分为 反射型 XSS、DOM 型 XSS、存储型 XSS,其中 反射型 XSS 和 DOM 型 XSS 算是 非持久型 XSS 攻击,而 存储型 XSS 算是 持久型 XSS 攻击。

反射型 XSS(Reflected XSS)
攻击步骤:
1、攻击构造出特殊的 URL ,其中包含恶意代码。
2、用户被诱导打开带有恶意代码的 URL,服务器端将恶意代码从 URL 中取出当做参数处理,然后返回给用户带有恶意代码的数据。
3、用户浏览器接收到响应解析执行,混在其中的恶意代码也被执行。
4、恶意代码窃取用户敏感数据发送给攻击者,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

DOM 型 XSS(DOM-based XSS)
攻击步骤:
1、攻击者构造出特殊的 URL,其中包含恶意代码。
2、用户被诱导打开带有恶意代码的 URL。
3、用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
4、恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

存储型 XSS(Stored XSS)
存储型 XSS 跟 反射型 XSS 的区别是:存储型 XSS 的恶意代码存在服务器上,反射型 XSS 的恶意代码存在 URL 里。
攻击步骤:
1、攻击者把恶意代码提交到目标网站的服务器中。
2、用户打开目标网站,网站服务器端把带有恶意代码的数据取出,当做正常数据返回给用户。
3、用户浏览器接收到响应解析执行,混在其中的恶意代码也被执行。
4、恶意代码窃取用户敏感数据发送给攻击者,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

防御方法

  • 浏览器自带防御 (X-XSS-Protection )

    并不能完全防止反射型 XSS,而且也并不是所有浏览器都支持 X-XSS-Protection。

  • 转义

    在 XSS 攻击中,攻击者主要是通过构造特殊字符来注入脚本,需要在客户端与服务端都进行输入检测,然后对用户输入的数据进行转义。

主要就是对输入所包含的特殊字符进行转义,如 <,>,&,",',来防止 XSS 攻击。

  • 过滤

    在富文本中因为需要保留 HTML ,所以我们不能使用转义的方法防御 XSS 攻击,这里使用过滤的方式防御 XSS 攻击,也就是通过只使用白名单允许的 HTML 标记及其属性。

  • 内容安全策略(CSP)

    内容安全策略(Content Security Policy,CSP),实质是白名单制度,开发者制定给客户端哪些外部资源可以加载和执行,增强网页安全性。

两种方法可以启用 CSP。一种是通过 HTTP 头信息的 Content-Security-Policy 的字段。

    Content-Security-Policy: script-src 'self'; 
    object-src 'none';
    style-src cdn.example.org third-party.org; 
    child-src https:
    上面代码中,CSP 做了如下配置。
    script-src: 只信任当前域名
    object-src: 不信任任何 URL,即不加载任何资源
    style-src: 只信任 cdn.example.org 和 third-party.org
    child-src:如 <frame>、<iframe>: 必须使用HTTPS协议加载
    其他资源: 没有限制
    启用后,不符合 CSP 的外部资源就会被阻止加载。

    另一种是通过网页的 <meta> 标签。
    <meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">