XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,用户访问网站后不知不觉就执行了脚本,攻击者可获取用户的敏感信息,如 Cookie、SessionID 等。
XSS 的本质是:恶意代码没有经过过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。
根据攻击的来源,XSS 攻击可分为存储型、反射型和 DOM 型三种。
类型 | 存储区 | 插入点 |
---|---|---|
存储型 XSS | 后端数据库 | HTML |
反射型 XSS | URL | HTML |
DOM 型 XSS | 后端数据库/前端存储/URL | 前端 JavaScript |
存储型和反射型 XSS 都是在服务端取出恶意代码后,插入到响应 HTML 里的;因此预防这两种漏洞,有两种常见做法:
onclick
等、<a>
标签的href
属性、<script>
标签、css 中的url
功能)不要直接把后端传来的数据作为 html 来渲染,比如innerHtml()/outerHtml()/document.write()
等方法,又比如 Vue 的v-html
;尽量使用textContent/setAttribute()
。
严格的 CSP 在 XSS 的防范中可以起到以下的作用:
存储型 XSS 的攻击步骤:
这种攻击常见于公开用户提交数据(UGC 内容)的网站功能,如论坛发帖、商品评论、用户私信等。
反射型 XSS 的攻击步骤:
反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。
反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。
DOM 型 XSS 的攻击步骤:
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。