【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?

Concept: XSS(Cross-Site Scripting,跨站脚本)


1) 概念解释 / Concept (Plain English + 中文)

EN: XSS (Cross-Site Scripting) is a web vulnerability where an attacker injects untrusted JavaScript into a page so that it runs in other users' browsers. With the victim's session, the script can steal cookies/tokens, hijack accounts, deface UI, or pivot to further attacks .
CN: XSS(跨站脚本) 是一种网页漏洞:攻击者把不可信的 JavaScript 注入页面,让它在其他用户的浏览器中执行。脚本继承受害者会话权限,可窃取 Cookie/令牌、劫持账号、篡改界面或发起进一步攻击


2) XSS 的三种主要类型 / Three Main Types

  • Stored XSS(存储型)
    EN: Payload is stored on the server (e.g., DB, comments) and served to every viewer.
    CN: 载荷被保存到服务器(如数据库/评论),每个访问者都会中招。

  • Reflected XSS(反射型)
    EN: Payload comes from the request (URL/param), is reflected in the response and runs once when the victim clicks the crafted link.
    CN: 载荷来自请求(URL/参数),被原样反射到响应中,用户点击恶意链接时触发一次。

  • DOM-based XSS(基于 DOM)
    EN: The page's client-side JS reads untrusted data (e.g., location.hash) and writes it into the DOM without proper escaping , executing arbitrary code.
    CN: 页面前端脚本 从不可信来源(如 location.hash)读入数据并直接写入 DOM,因未正确转义而执行任意代码。


3) 运行原理 / How XSS Works (Essentials)

  1. Unsanitized input reaches a dangerous sink (HTML/JS/URL/attribute).
  2. Browser interprets the injected content as code (not text).
  3. Malicious code runs in the origin of the site (same cookies/session/storage).

常见危险输出场景 / Sinks

  • HTML 内容上下文<div>UNTRUSTED</div>
  • HTML 属性上下文<img src="UNTRUSTED">onclick="UNTRUSTED"
  • JS 字面量上下文var x = 'UNTRUSTED';
  • URL/链接上下文<a href="UNTRUSTED">
  • DOM APIinnerHTML, document.write, insertAdjacentHTML

4) 影响与危害 / Impact

  • 读取/发送 Cookie、LocalStorage、CSRF Token
  • 伪造 UI、钓鱼框、键盘记录
  • 发起 CSRF-like 动作(在受害者会话下请求)
  • 作为内网渗透的跳板(对同源接口继续攻击)

5) 防御(四大主线,场景化) / Defenses (Four Pillars, Context-Aware)

  1. 输入验证(Input Validation):拒绝明显危险输入(黑名单不可靠,白名单/结构化校验更稳)。

  2. 上下文相关的输出编码(Output Encoding/Escaping)

    • HTML 文本 → HTML-escape (&lt; &gt; &amp; &quot;)
    • HTML 属性 → 属性编码
    • JS 字符串 → JS 字符串转义
    • URL → URL 编码
  3. 内容安全策略(CSP) :使用 Content-Security-Policy 限制脚本来源,禁止 unsafe-inline,结合 nonce/hash。

  4. 安全 Cookie 与框架自转义HttpOnly(阻 JS 读 Cookie)、SameSite,选用默认输出转义的模板/框架(如 React、Django 模板等),并避免 dangerouslySetInnerHTML / innerHTML 等直写。

小提示:XSS 防御="在合适的上下文做合适的编码"+"减少可执行脚本来源(CSP)"+"收紧会话凭据的可读性(HttpOnly)"。


6) 比喻 / Metaphor

EN: Think of your web page as a stage , and user input as props . Props must be checked and kept as props . If you mistakenly let props become scripts (actors giving commands), they can run the show.
CN: 把网页想成舞台 、用户输入是道具 。道具只能当道具,不能变剧本台词。一旦把道具当成脚本,演员就被"恶意台词"指挥了。


7) Multiple Choice(5 题选择,逐题解释对/错)

Q1. Which statement best defines XSS? / 哪个对 XSS 的定义最准确?

A. Server uploads malware to user's computer

B. Attacker injects SQL to read DB
C. Attacker injects JavaScript that runs in victim's browser

D. Browser blocks all scripts by default

Why(对): XSS 的核心是浏览器执行攻击者注入的 JS
Why not(错): A=恶意软件投送;B=SQL 注入;D=不符合事实。


Q2. Stored vs Reflected XSS difference? / 存储与反射的差异?

A. Stored is in DB and affects many users; Reflected is from request & one-off ✅

B. Both require DB

C. Reflected persists in server

D. Stored only works with iframes

✅ A 正确
Why not: B/C/D 皆与定义不符或过度限定。


Q3. Which is MOST effective to stop DOM-based XSS? / 最能阻止 DOM 型 XSS 的是?

A. Only using HTTPS

B. Printing user input as is
C. Avoid innerHTML and use safe APIs; encode per context

D. Disable CSS files

✅ C 正确 (避免危险 DOM sink,按上下文编码)
Why not: A=传输安全非 XSS 防线;B=最危险;D=无关。


Q4. Which header helps reduce XSS impact? / 哪个响应头能降低 XSS 影响?

A. Server:
B. Content-Security-Policy

C. ETag

D. Accept-Encoding

✅ B 正确 (CSP 可限制脚本来源/内联执行)。
Why not: 其他与脚本执行无关。


A. Secure
B. HttpOnly

C. Domain

D. Max-Age

✅ B 正确HttpOnly 禁止 JS 访问 Cookie)。
Why not: A=仅限 HTTPS 传输;C/D=域/寿命设置。


8) Short Answer(5 题简答,简洁好记)

S1. Explain DOM-based XSS in one or two lines. / 用一句话解释 DOM 型 XSS。

EN: Client-side JS reads untrusted data and writes it into the DOM as code.
CN: 前端脚本把不可信数据写进 DOM 当代码执行。


S2. Give one practical example of Reflected XSS. / 举一个反射型 XSS 的例子。

EN: A search page echoes ?q=<script>alert(1)</script> without encoding; clicking the crafted link executes alert.
CN: 搜索页直接回显 ?q=<script>alert(1)</script>,未编码即执行。


S3. Name four main XSS defenses. / 说出四个主要防御点。

EN: Input validation, context-aware output encoding , CSP, HttpOnly/SameSite cookies (plus safe frameworks).
CN: 输入验证、按上下文输出编码 、CSP、HttpOnly/SameSite(外加默认转义框架)。


S4. Why is context-aware encoding important? / 为何必须"按上下文编码"?

EN: The escaping rules differ in HTML text, attribute, JS string, and URL; wrong encoding leaves gaps.
CN: HTML/属性/JS/URL 的转义规则不同,用错就会留洞。


S5. How does CSP reduce XSS risk? / CSP 如何降低 XSS 风险?

EN: By allowing scripts only from trusted origins and blocking inline/eval; attackers' injected code can't load or execute.
CN: 限定可信脚本来源并禁止内联/eval,使注入脚本无法加载或执行。


9) 复盘速记 / Quick Recap

  • XSS = 让"输入"变"脚本":Stored(入库)、Reflected(回显)、DOM(前端拼装)。
  • 核心防线上下文编码 + 限制脚本执行(CSP) + 收紧会话读取(HttpOnly) + 减少危险 sink
  • 调试方向:找"输入→输出"路径、定位 DOM sink、核对编码点与 CSP 生效情况。
相关推荐
阿文和她的Key7 分钟前
一个失控的AI智能体在4.5天内完成了17,600次攻击:从这次事件看AI安全治理的四层裂痕
人工智能·安全
一棵白菜14 分钟前
mac 部署 n8n
前端
学高数就犯困17 分钟前
React:常见的性能优化手段
前端·react.js
天天码行空17 分钟前
vkeyboardhand:零依赖虚拟键盘指法组件
前端·javascript·vue.js
东方小月17 分钟前
从零开发一个 Coding Agent(五):使用 TypeBox 校验工具参数
前端·人工智能·后端
我要两颗404西柚28 分钟前
Stage four:VUE项目上线
前端·javascript·vue.js
尤乐娃子33 分钟前
进入大厂(厂子大)实习Day8
前端·笔记·实习
醉城夜风~1 小时前
CSS盒模型(Box Model)
前端·css
枫叶v.1 小时前
Prompt Injection 防不住怎么办?从 Source-Sink 模型设计 Agent 安全边界
数据库·安全·prompt
雪隐1 小时前
个人电脑玩AI-15让5060 Ti给你打工——MiniMax H3 本地部署实录:一个自带录音棚的视频模型,和它的 NVFP4 瘦身奇遇
前端·人工智能·后端