November 24, 2017
XSS 攻击是一个很大的 Web 安全问题。XSS 攻击无处不在,但是到目前为止没有一套简单成熟的防御机制。
存储型 XSS
反射型 XSS
DOM 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 漏洞防御措施 |
Written by ricosmall.
Github