在当今数字化时代,网络安全已成为个人和企业不可忽视的重要议题。其中,跨站脚本攻击(Cross-Site Scripting, 简称XSS) 是最常见的Web安全漏洞之一,它允许攻击者将恶意脚本注入到看似可信的网页中,当其他用户浏览该页面时,这些脚本便会在他们的浏览器上执行,从而导致信息泄露、会话劫持甚至账户被盗等严重后果。

尽管“XSS”这个术语广为人知,但其内部的分类体系却常常被误解或混淆。本文将为您系统性地梳理XSS漏洞的正确分类——即反射型XSS、存储型XSS和DOM型XSS,并结合原理、实例与防护措施,帮助您全面理解这一关键的安全威胁。
什么是XSS漏洞?
XSS(Cross-Site Scripting)本质上是一种代码注入攻击。其核心原理在于:
输入未过滤:Web应用程序未能对用户提交的数据(如URL参数、表单内容、评论等)进行严格的验证或转义。
恶意代码执行:攻击者利用此漏洞,向页面中注入JavaScript或其他可执行脚本。
浏览器信任执行:由于脚本来源于合法网站,用户的浏览器会将其视为可信内容并自动执行,进而造成Cookie窃取、钓鱼攻击、流量劫持等危害。
⚠️ 特别提醒:未经授权的渗透测试行为属于违法行为,请仅将本文知识用于合法合规的安全学习与防护。
XSS漏洞的三大正确分类
根据攻击方式、持久性和触发机制的不同,XSS漏洞被业界普遍划分为以下三类:
1. 反射型XSS(Reflected XSS)——非持久型攻击
✅ 基本特征:
恶意脚本通过URL参数传递(如
?name=<script>alert(1)</script>)。服务器不会永久存储该脚本,而是“反射”回响应页面。
攻击依赖于诱导用户点击特定链接,具有一次性特点。
🔍 攻击流程示例:
📍 典型场景:
搜索框
错误提示页面
登录失败提示
🛡 防御建议:
对所有输出数据进行HTML实体编码(如
<→<)使用CSP(Content Security Policy)限制脚本来源
避免直接将用户输入回显到页面中
2. 存储型XSS(Stored XSS)——持久型攻击
✅ 基本特征:
恶意脚本被永久存储在目标服务器的数据库、文件或缓存中。
所有访问该页面的用户都会自动触发攻击,影响范围广。
危害最大,常用于蠕虫传播、大规模数据窃取。
🔍 攻击流程示例:
📍 典型场景:
博客评论区
用户资料页
商品评价系统
🛡 防御建议:
输入时严格过滤危险标签(如
<script>、onerror=)输出时统一进行HTML转义处理
使用成熟的安全库(如DOMPurify)净化富文本内容
设置HttpOnly Cookie防止JS读取敏感信息
3. DOM型XSS(DOM-based XSS)——客户端动态生成漏洞
✅ 基本特征:
完全在客户端发生,不依赖服务器端响应。
利用前端JavaScript操作DOM时的安全缺陷。
恶意负载通常藏匿于URL的哈希值(#)部分。
🔍 攻击流程示例:
📍 典型场景:
单页应用(SPA)
动态排序/筛选功能
前端路由处理不当
🛡 防御建议:
避免使用
innerHTML、eval()、setTimeout(string)等危险方法优先使用
textContent、setAttribute()等安全API对来自URL、localStorage等外部源的数据进行校验与编码
启用严格的CSP策略
常见XSS Payload标签与绕过技巧(仅供研究)
为了更深入理解XSS攻击手法,以下是常见的测试载荷(PoC),请仅用于合法安全评估:
| 标签 | 示例 | 说明 |
|---|---|---|
<script> | <script>alert(1)</script> | 最直接的方式,常被WAF拦截 |
<img onerror> | <img src=x onerror=alert(1)> | 利用图片加载失败触发 |
<svg onload> | <svg onload=alert(1)> | HTML5特性,绕过部分过滤 |
<iframe src> | <iframe src="javascript:alert(1)"> | 内嵌脚本执行环境 |
javascript:伪协议 | <a href="javascript:alert(1)">Click</a> | 依赖用户交互 |
常见绕过技术:
大小写混合:
<ScRiPt>alert(1)</ScRiPt>空格替换:
<img/src=x/onerror=alert(1)>引号省略:
<img src=x onerror=alert1`>`编码混淆:HTML实体、Unicode、Base64编码
标签嵌套:
<scr<script>ipt>alert(1)</script>
💡 提示:现代Web框架(如React、Vue)默认对变量插值进行转义,有效降低了XSS风险,但仍需警惕
dangerouslySetInnerHTML等高危API的使用。
如何有效防范XSS攻击?
| 防护措施 | 适用类型 | 说明 |
|---|---|---|
| 输入验证与过滤 | 存储型、反射型 | 白名单机制优于黑名单 |
| 输出编码/转义 | 所有类型 | 根据上下文选择合适的编码方式(HTML、JS、URL) |
| 使用CSP | 所有类型 | 明确允许的脚本源,阻止内联脚本执行 |
| 设置HttpOnly Cookie | 所有类型 | 阻止JavaScript访问敏感Cookie |
| 采用安全开发框架 | 所有类型 | 利用框架内置防护机制 |
XSS漏洞虽已存在多年,但因其隐蔽性强、利用门槛低,依然是当前Web安全的主要威胁之一。掌握其正确的分类方式——反射型、存储型与DOM型,是构建有效防御体系的第一步。
作为开发者,应始终坚持“永不信任用户输入”的原则;作为安全爱好者,则需不断学习最新的攻击与防御技术。唯有如此,才能在日益复杂的网络环境中守护数字世界的安宁。





















