XSS 是指在表单里输入的文字,在另一个人的画面上作为脚本运行起来。本文从零讲解其原理与可靠的防范方法(不会写出攻击步骤)。
三种类型
XSS 按「恶意字符串经由何处被执行」分为三种。
| 类型 | 如何被植入 |
|---|---|
| 存储型(Stored) | 被保存在帖子、个人资料等处,在所有浏览者的浏览器中执行(最危险) |
| 反射型(Reflected) | URL 参数等被原样反射到页面上,在点击了链接的人那里执行 |
| DOM 型(DOM-based) | 不经由服务器,由浏览器端的 JS 危险地处理输入而引发 |
为什么危险(原理)
浏览器会把页面中写的 <script> 当作「正规代码」执行。当攻击者的字符串原样作为 HTML 混入页面时,浏览器无法把它和真正的代码区分开。
危害是「在那个页面上能做的一切」。如果说 RCE 是服务器端最严重的漏洞,那么 XSS 就是客户端(用户)侧最严重的漏洞。
防御:输出时转义
XSS 的基本原则是用「输出」而非「输入」来防。在把值显示到画面上的那一刻,将其转换为不会被当作 HTML 解析的形式。
输出时转义(最重要)
把来自用户的值显示到画面上时,将 < > & " ' 等转换为 HTML 实体。要按输出所处的位置(HTML 正文·属性·JS·URL)采用各自正确的方式。
不要破坏框架的自动转义
React/Vue/各类模板默认会自动转义。只要避免 dangerouslySetInnerHTML 或 v-html 这类「直接插入生 HTML」的做法,就能防住大部分情况。
用 CSP(Content-Security-Policy)做多层防御
万一有遗漏,也能在浏览器端阻止未经许可的脚本执行。通过限制内联脚本等手段把危害降到最低。
保护 Cookie
给会话 Cookie 加上 HttpOnly,让 JS 无法读取。即便 XSS 漏过去,也能减小危害。
本站的观点:最大的防御是不要自己关掉安全功能
现代框架默认就倾向于安全一侧。许多 XSS 正是在开发者 「想直接放入 HTML」而刻意关掉自动转义的那一刻产生的。如果确实要允许 HTML,就不要用自己写的字符串处理,而要使用经过验证的 sanitize 工具处理。「为了方便而放弃安全」才是最大的风险。
XSS 与容易混淆的攻击有何不同
XSS 常被和名字相近的 CSRF,以及同样属于「输入被当作指令处理」的 SQL 注入混为一谈。区别在于:执行的是什么,在哪里执行。
| 攻击 | 在哪里发生什么 | 主要防御 |
|---|---|---|
| XSS | 攻击者的脚本作为真实页面的一部分,在用户的浏览器中执行 | 输出时转义、CSP |
| CSRF | 利用用户的登录状态,发送用户本人并不想发的请求。不需要运行脚本 | CSRF 令牌、SameSite Cookie |
| SQL 注入 | 输入在服务器上被解释为 SQL 语句的一部分 | 占位符(参数化查询) |
| 点击劫持 | 把真实页面透明地叠在上层,让用户在不知情的情况下点击 | CSP 的 frame-ancestors |
需要注意的是,XSS 还能绕过 CSRF 防御。一旦脚本在页面内运行,它也能读取该页面上的 CSRF 令牌(OWASP 的 CSRF 指南也给出了同样的提醒)。
实例:员工打开的画面中的 XSS
2026 年,学习管理系统 Canvas 的运营公司 Instructure 表示,一起入侵事件是从 XSS 开始的。据该公司称,攻击者用免费账户提交了含有恶意代码的支持工单,当客服人员打开它时,XSS 漏洞被利用,攻击者由此在 Canvas 内获得了更高的权限(→ Canvas(Instructure)信息泄露事件(英文))。
教训是:XSS 不只是公开页面的问题。客服、咨询、管理后台这类向自家员工展示外部发来文本的画面,因为打开它的账户权限更大,风险反而更高。
XSS 至今仍是最常见的弱点之一。在 MITRE 于 2025 年 12 月发布的「CWE Top 25」(最危险的 25 种软件弱点)中,XSS(CWE-79)位列第一。2024 年 9 月,美国 CISA 与 FBI 也发布警报,要求软件厂商从产品中消除 XSS。
检查自己网站的方法
不需要去尝试攻击字符串。先从下面四项检查开始。
找出直接插入 HTML 的地方
在代码中搜索 dangerouslySetInnerHTML、v-html、innerHTML 和 document.write,确认是否有来自用户的值可能流到这里。如果有,就改为作为文本显示,或经过验证可靠的 sanitize 工具处理。
检查会话 Cookie 的属性
在浏览器开发者工具(Application → Cookies)中,确认会话 Cookie 带有 HttpOnly 和 Secure。网站综合安全诊断也会检查 Cookie 属性。
把管理和客服画面也纳入检查
确认显示外部文本(工单正文、文件名、显示名称)的内部画面,也按照与公开页面相同的标准做了转义。
参考资料(一手来源)
- OWASP, "Cross Site Scripting Prevention Cheat Sheet" — cheatsheetseries.owasp.org(按输出上下文转义、框架的安全默认值)
- MITRE, "2025 CWE Top 25 Most Dangerous Software Weaknesses"(2025 年 12 月)— cwe.mitre.org(CWE-79 位列第一)
- CISA and FBI, "Secure by Design Alert: Eliminating Cross-Site Scripting Vulnerabilities"(2024 年 9 月 17 日)— cisa.gov
- OWASP, "Cross-Site Request Forgery Prevention Cheat Sheet" — cheatsheetseries.owasp.org(XSS 可以绕过 CSRF 防御)
- IPA「安全なウェブサイトの作り方」(日语)— ipa.go.jp
接下来阅读
- 术语:CSRF 是什么 / RCE 是什么 / JWT 是什么(XSS 中容易被窃取的令牌)
- 多层防御:安全响应头不是堆得越多越好(CSP 可以缩小 XSS 能做的事)
- 入门:安全超入门