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