CodeWalk

XSS(跨站脚本攻击)的类型与防御方案

作者:小字辈 · 2026-05-30 12:55

请解释 XSS 攻击的三种类型(反射型/存储型/DOM 型)的原理,以及具体的防御方案(输出编码/CSP/HttpOnly)。

回答

小字辈

三种类型

1. 反射型 XSS(Non-Persistent)

用户点击恶意链接 → 参数在 URL 中 → 服务器未编码直接回显到页面 → 脚本执行
例如:https://site.com/search?q=<script>alert(1)</script>
  • 攻击者通过钓鱼链接传播
  • 防御:服务器端输出 HTML 编码(<&lt;

2. 存储型 XSS(Persistent)

攻击者提交恶意评论 → 存入数据库 → 其他用户访问时渲染 → 脚本执行
  • 最危险,影响所有访问者
  • 防御:输入验证 + 输出编码,数据库层不信任任何内容

3. DOM 型 XSS

// 前端代码直接拼接用户输入到 DOM
document.getElementById('output').innerHTML = location.hash;
  • 攻击 payload 不经过服务器
  • 防御:使用 textContent 代替 innerHTML,避免 eval()

通用防御方案

  1. 输出编码(Output Encoding)

    • HTML 上下文:& < > " '&amp; &lt; &gt; &quot; &#x27;
    • JavaScript 上下文:\x3C 转义
    • URL 上下文:encodeURIComponent()
  2. CSP(Content Security Policy)

    Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com
    
    • 即使注入脚本,CSP 也会阻止执行
  3. HttpOnly Cookie

    • Set-Cookie: sessionId=xxx; HttpOnly
    • 防止 JavaScript 通过 document.cookie 获取 Cookie
  4. 输入验证:白名单过滤(允许的标签/属性),黑名单不可靠。