概念
跨站脚本攻击(Cross-Site Scripting, XSS),可以将代码注入到用户浏览的网页上,这种代码包括 HTML 和 JavaScript。
攻击原理

危害
- 偷取网站任意数据
- 偷取用户资料
- 劫持前端逻辑
- 显示伪造的文章或者图片
攻击分类
1. 反射型
反射型指的是 url 参数直接注入。比如:在浏览器地址栏中
localhost:1521?from=<script>alert(1)</script>Bai
2. 存储型
存储到数据库后读取时注入。
一个攻击者在论坛的楼层中包含了一段 JavaScript 代码,并且服务器没有正确进行过滤,那就会造在浏览这个页面时会执行这段 JavaScript 代码。
XSS 攻击注入点
1. HTML 节点内容
<div>#{content}</div>
注入点:
<div><script></script></div>
2. HTML 属性
<img src="#{image}"/>
注入点:
<img src="1" onerror="alert(1)"/>
其中 1” onerror=”alert(1) 就是 #{image} 。这里可看出 <img>多了一个属性 onerror。
3. JavaScript 代码
<script>var data="#{data}";</script>
注入点:
<script>var data="hello";alert(1);"";</script>
其中 hello”;alert(1);” 就是 #{data}。这里可看出实际上是即为 data 赋值,也进行了 alert 操作。
4. 富文本
富文本需要保留 HTML,但 HTML 存在 XSS 攻击风险。
防御
浏览器自带防御
使用浏览器自带防御可防御一些 XSS。但是存在一些不足:
- 只能对参数出现在 HMTL 内容或属性的反射型 XSS 进行防御
- 并不是所有浏览器都支持对 XSS 的防御
HTML 内容
<div><script></script></div>
解决:
- 将
<转义为< - 将
>转义为>
转义后:
<div><script></script></div>
HTML 属性
<img src="1" onerror="alert(1)"/>
解决:
- 将
"转义为&quto; - 将
'转义为' - 将空格转义为
 
转义后:
<img src="1&quto; onerror=&quto;alert(1)"/>
JavaScript 代码
<script>var data="hello";alert(1);"";</script>
解决:
- 将
"转义为\" - 将
\转义为\\ - 或者转化为 json
转义后:
<script>var data="hello\";alert(1);\"";</script>
富文本
CSP
内容安全策略(Content Security Policy):用于指定那些内容可执行。
