XSS最核心的问题把一段用户的文本插入到网页中当做标签(innerHTML)或者脚本(服务端渲染JS)来处理了。
解决办法:
- 前后端分离,通过ajax请求数据,避免服务端渲染页面。
- ajax响应的数据,前端JS完全不使用innerHTML
注意:
针对IE浏览器,某些场景下会忽略把异步请求的结果当做HTML来处理,需将响应数据包的content-type 定为
application/json
或text/javascript
,同时添加X-Content-Type-Options: nosniff
头。针对富文本编辑器需要把后台数据当做标签来innerHTML的情况,在用户写入该字段的请求中需添加标签白名单,把不在白名单中的标签统统过滤掉。
反射型XSS
把用户的输入(比如URL参数或者表单)前端直接填充到页面或者经后台请求填充到页面。
存储型XSS
用户的输入存储到DB后,前端请求到数据后直接innerHTML到页面。