XSS 的三种类型是什么
按触发路径划分,XSS 分为反射型、存储型与 DOM 型。反射型把单次请求里的数据回显到响应中,往往需要诱导点击链接;存储型把脚本内容持久化到服务端,任何访问该页面的用户都会中招,因此危害面最大;DOM 型完全发生在浏览器端,页面脚本从 URL 或本地存储读取数据并写入危险位置,服务端响应里看不到攻击内容。三者的差别决定了检测位置与修复位置:前两类看服务端输出编码,第三类要审计前端代码的数据流。
基本信息
| 共同根因 | 不可信数据被当作代码在浏览器中执行 |
|---|---|
| 反射型特征 | 响应里直接包含请求参数的内容 |
| 存储型特征 | 恶意内容落库,其他用户访问时执行 |
| DOM 型特征 | 数据从未经过服务端,前端脚本写入页面 |
| 主要检测手段 | 回显测试、代码审计、前端源码扫描 |
| 修复位置 | 反射与存储看服务端输出编码,DOM 看前端数据流 |
典型场景
- 搜索页与错误页把参数原样写回页面,属于反射型高发位置
- 留言、昵称与工单标题落库后展示,属于存储型高发位置
- 单页应用从 URL 片段读取参数并插入页面,是 DOM 型的常见路径
- 富文本与 Markdown 渲染内容,需要白名单净化
- 第三方统计与广告脚本注入的页面,需评估外部内容来源
- 后台运营查看用户提交内容时执行脚本,影响管理员会话
类型对比
| 类型 | 触发方式 | 修复位置 |
|---|---|---|
| 反射型 | 链接参数回显到页面 | 服务端输出编码 |
| 存储型 | 数据入库后被展示 | 入库净化加输出编码 |
| DOM 型 | 前端 JS 从危险源写入危险汇 | 前端代码审计:source 到 sink 链路 |
DOM 型常见危险汇(sink)
DOM 型常见危险汇(sink)
innerHTML / outerHTML
document.write
insertAdjacentHTML
eval / new Function
location 赋值用户可控 URL
# 数据源(source)常见于 location.search、location.hash、document.referrer 与本地存储
# 排查方法:从 source 出发跟到 sink,检查中间是否经过编码或白名单过滤DOM 型不经过服务端,部分扫描器与 WAF 看不到,前端代码审计与依赖梳理更重要。
存储型的复测要注意数据来源:修复后应重新提交一份含标记字符的内容,确认在展示端被编码,同时清理历史遗留的恶意数据。