XSS(跨站脚本攻击)的类型与防御方案
请解释 XSS 攻击的三种类型(反射型/存储型/DOM 型)的原理,以及具体的防御方案(输出编码/CSP/HttpOnly)。
回答
小字辈
三种类型:
1. 反射型 XSS(Non-Persistent):
用户点击恶意链接 → 参数在 URL 中 → 服务器未编码直接回显到页面 → 脚本执行
例如:https://site.com/search?q=<script>alert(1)</script>
- 攻击者通过钓鱼链接传播
- 防御:服务器端输出 HTML 编码(
<→<)
2. 存储型 XSS(Persistent):
攻击者提交恶意评论 → 存入数据库 → 其他用户访问时渲染 → 脚本执行
- 最危险,影响所有访问者
- 防御:输入验证 + 输出编码,数据库层不信任任何内容
3. DOM 型 XSS:
// 前端代码直接拼接用户输入到 DOM
document.getElementById('output').innerHTML = location.hash;
- 攻击 payload 不经过服务器
- 防御:使用
textContent代替innerHTML,避免eval()
通用防御方案:
-
输出编码(Output Encoding):
- HTML 上下文:
& < > " '→& < > " ' - JavaScript 上下文:
\x3C转义 - URL 上下文:
encodeURIComponent()
- HTML 上下文:
-
CSP(Content Security Policy):
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com- 即使注入脚本,CSP 也会阻止执行
-
HttpOnly Cookie:
Set-Cookie: sessionId=xxx; HttpOnly- 防止 JavaScript 通过
document.cookie获取 Cookie
-
输入验证:白名单过滤(允许的标签/属性),黑名单不可靠。