术语表

XSS(跨站脚本)是什么:让攻击者的脚本在其他用户浏览器中执行的漏洞

XSS(跨站脚本)是让攻击者植入的脚本在其他用户浏览器中执行的漏洞,会导致会话被窃取、页面被篡改。讲解存储型、反射型、DOM 型三种类型,以及输出转义、自动转义与 CSP 等防御。

发布于 2026-06-08 更新于 2026-10-06 3 分钟阅读
本页目录

XSS 是指在表单里输入的文字,在另一个人的画面上作为脚本运行起来。本文从零讲解其原理与可靠的防范方法(不会写出攻击步骤)。

三种类型

XSS 按「恶意字符串经由何处被执行」分为三种。

类型如何被植入
存储型(Stored)被保存在帖子、个人资料等处,在所有浏览者的浏览器中执行(最危险)
反射型(Reflected)URL 参数等被原样反射到页面上,在点击了链接的人那里执行
DOM 型(DOM-based)不经由服务器,由浏览器端的 JS 危险地处理输入而引发

为什么危险(原理)

浏览器会把页面中写的 <script> 当作「正规代码」执行。当攻击者的字符串原样作为 HTML 混入页面时,浏览器无法把它和真正的代码区分开。

① 攻击者发布「字符串」(评论·名字·URL 等)
↓ 服务器未转义就输出
② 该字符串作为 HTML 的一部分混入页面
↓ 受害者打开页面
③ 代码在受害者的浏览器中执行=会话被窃取·冒充
把来自用户的字符串「原样」输出时,浏览器会把它当作代码执行。

危害是「在那个页面上能做的一切」。如果说 RCE 是服务器端最严重的漏洞,那么 XSS 就是客户端(用户)侧最严重的漏洞。

防御:输出时转义

XSS 的基本原则是用「输出」而非「输入」来防。在把值显示到画面上的那一刻,将其转换为不会被当作 HTML 解析的形式。

1

输出时转义(最重要)

把来自用户的值显示到画面上时,将 < > & " ' 等转换为 HTML 实体。要按输出所处的位置(HTML 正文·属性·JS·URL)采用各自正确的方式。

2

不要破坏框架的自动转义

React/Vue/各类模板默认会自动转义。只要避免 dangerouslySetInnerHTML 或 v-html 这类「直接插入生 HTML」的做法,就能防住大部分情况。

3

用 CSP(Content-Security-Policy)做多层防御

万一有遗漏,也能在浏览器端阻止未经许可的脚本执行。通过限制内联脚本等手段把危害降到最低。

4

保护 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。

检查自己网站的方法

不需要去尝试攻击字符串。先从下面四项检查开始。

1

找出直接插入 HTML 的地方

在代码中搜索 dangerouslySetInnerHTML、v-html、innerHTML 和 document.write,确认是否有来自用户的值可能流到这里。如果有,就改为作为文本显示,或经过验证可靠的 sanitize 工具处理。

2

确认是否发送了 CSP

用安全响应头检查器确认是否存在 Content-Security-Policy 以及它允许了什么。允许 'unsafe-inline' 会大大削弱对 XSS 的防护。要新写一份时,可以先用 CSP 生成器起草,并先以 Report-Only 模式(只报告违规、不拦截)运行。

3

检查会话 Cookie 的属性

在浏览器开发者工具(Application → Cookies)中,确认会话 Cookie 带有 HttpOnly 和 Secure。网站综合安全诊断也会检查 Cookie 属性。

4

把管理和客服画面也纳入检查

确认显示外部文本(工单正文、文件名、显示名称)的内部画面,也按照与公开页面相同的标准做了转义。

参考资料(一手来源)

  • 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

接下来阅读

分类编号

CWE 对导致漏洞的弱点类型进行分类,MITRE ATT&CK 对攻击者的技术进行分类。两者均由 MITRE 维护,广泛用于标注漏洞信息和检测规则。

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

QXSS 会造成什么后果?
A

攻击者植入的脚本会作为真实页面的一部分在受害者的浏览器中执行。结果可能导致会话被窃取(冒充登录)、输入被偷看、页面被篡改、自动执行其他操作等。

QXSS 最主要的防御是什么?
A

是「输出时转义」。把来自用户的值显示到页面上时,将其转换为不会被当作 HTML 解析的形式。React/Vue 等模板默认就会这样做,所以不要自己破坏这套自动转义(避免使用 dangerouslySetInnerHTML 等)就是最有效的对策。此外再用 CSP 做多层防御。

Q在输入时做 sanitize 就够了吗?
A

往往不够。可靠的防御是「按输出所处的上下文(HTML 正文·属性·JS·URL)分别正确地 escape」。只靠输入过滤,会因为搞错上下文而出现遗漏。只有在确实要允许 HTML 时,才使用可信赖的 sanitize 工具。

Q为什么叫 XSS 而不是 CSS?
A

Cross-Site Scripting 的首字母缩写本来是 CSS,但这会和网页样式语言 CSS(Cascading Style Sheets,层叠样式表)重名。所以把「Cross」写成 X,XSS 就成了通行的缩写。

Q部署了 CSP,还需要其他 XSS 防御吗?
A

需要。CSP(Content-Security-Policy,内容安全策略)是在转义出现遗漏时限制危害的第二道防线。允许 'unsafe-inline' 的 CSP,对 XSS 的防护效果会大打折扣。输出时转义始终是基础,CSP 是叠加在其上的一层。

QCookie 设置了 HttpOnly,是不是就不用担心 XSS 了?
A

能减小危害,但不能消除。HttpOnly 只是让脚本无法读取 Cookie。通过 XSS 运行的脚本,仍然可以在页面内部以该用户的身份发送请求,并读取页面上显示的任何内容。HttpOnly 是限制危害的手段,而不是防止 XSS 的手段。