进击的前端

XSS防御

November 24, 2017

XSS 攻击是一个很大的 Web 安全问题。XSS 攻击无处不在,但是到目前为止没有一套简单成熟的防御机制。

XSS 攻击

  1. 存储型 XSS

  2. 反射型 XSS

  3. DOM XSS

XSS 防御

data type context code example defend method
String HTML Body <span>UNTRUSTED DATA</span> HTML Entity 编码
String 安全 HTML 变量 <input type="text" name="fname" value="UNTRUSTED DATA"> 1. HTML Attribute 编码
2. 只把不可信数据放在安全白名单内的变量上
3. 严格地校验不安全变量,如 background、id 和 name
String GET 参数 <a href="/site/search?value=UNTRUSTED DATA">clickme</a> URL 编码
String 使用在 src 或 href 变量上的不可信 URLs <a href="UNTRUSTED URL">clickme</a>
<iframe src="UNTRUSTED URL">
1. 对输入进行规范化
2. URL 校验
3. URL 安全性认证
4. 只允许使用 http 和 https 协议(避免使用 javscript 协议去打开一个新窗口)
5. HTML Attribute 编码
String CSS 值 <div style="width: UNTRUSTED DATA;">Selection</div> 1. 使用 CSS 编码
2. 使用 CSS Hex 编码
3. 良好的 CSS 设计
String javascript 变量 <script>var currentValue='UNTRUSTED DATA';</script><scrip>someFunction('UNTRUSTED DATA');</script> 1. 确保所有变量值都被引号括起来
2. 使用 javascript Hex 编码
3. 使用 javascript Unicode 编码
4. 避免使用反斜杠转义(”, ’ 或者 \)
HTML HTML Body <div>UNTRUSTED HTML</div> HTML 校验(JSoup, AntiSamy, HTML Sanitizer)
String DOM XSS <script>document.write('UNTRUSTED INPUT: '+window.location.hash);</script> 基于 DOM 操作的 XSS 漏洞防御措施

Kyle Mathews

Written by ricosmall.
Github