flawopen.com/XSS/XSS 类型
反射型、存储型与 DOM 型 XSS 有何区别?
参考页面
简要回答
反射型、存储型和 DOM 型描述了不可信数据进入浏览器不安全上下文的不同路径。它们可能重叠:关键是数据从哪里来、是否持久化、由哪段代码渲染,以及影响哪些用户。
三种类型
反射型 XSS — 数据来自请求
请求中的值未经上下文适配编码就进入响应,随后被浏览器解释为标记或脚本。攻击者可能诱使受害者点击特制链接,但根因是请求数据被不安全地渲染。应在渲染位置修复输出编码。
存储型 XSS — 数据被持久保存
不可信内容(如评论或个人资料字段)被保存,之后又不安全地呈现给其他用户。每个查看该内容的访客都可能进入相同的不安全上下文,直到修复已存值或渲染路径。
DOM 型 XSS — 客户端代码将数据写入不安全的 DOM sink
客户端 JavaScript 读取不可信来源(如 location.hash、URL 参数或服务器返回的数据),并写入 innerHTML 等不安全 DOM sink。数据可能不会到达服务器,但这不是必要条件:DOM 型 XSS 描述客户端 source-to-sink 路径,也可能与反射型或存储型传递方式重叠。应修复客户端数据流。
为何这种区别影响修复方式
应在渲染 sink 处使用上下文适配的输出编码或安全 DOM API 来修复 XSS。反射型和存储型 XSS 常涉及服务端渲染,但客户端渲染也可能产生不安全 sink。对 DOM 型 XSS,输出纯文本时优先使用 textContent 而不是 innerHTML;若确需富文本 HTML,则使用维护良好且策略明确的清理器。服务端编码不能替代客户端 source-to-sink 流程审查。
这些类别可能重叠
反射型和存储型描述输入如何到达页面以及是否会持久保存。DOM 型描述客户端的 source-to-sink 数据流。这些类别并不互斥:客户端代码将已持久保存的个人资料文本插入 innerHTML 时,该问题可以同时属于存储型和 DOM 型 XSS。
DOM 型 XSS:不安全 sink 与纯文本输出
不安全 — 将不可信文本解析为 HTML
const value = new URLSearchParams(location.search).get("q") ?? "";
target.innerHTML = value;
文本场景更安全 — 按纯文本显示
const value = new URLSearchParams(location.search).get("q") ?? "";
target.textContent = value;