跨站脚本攻击—XSS分类和防御
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:">
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。