以下是关于 CSRF(Cross-Site Request Forgery,跨站请求伪造) 的一些常见面试题,适用于前端和后端开发工程师、安全工程师等职位:
💡 基础题
1. 什么是 CSRF?
回答要点:
- 是一种攻击方式,攻击者诱导用户在已登录某网站的情况下,向该网站发送非本意的请求。
- 例如:用户登录了银行网站后,访问攻击者页面,攻击者构造一个表单发起转账请求,银行网站会误认为是用户发起的操作。
2. CSRF 和 XSS 的区别是什么?
| 项目 | CSRF | XSS |
|---|---|---|
| 攻击目标 | 用户的操作行为 | 用户浏览器执行恶意脚本 |
| 原理 | 利用用户已登录状态发送伪造请求 | 注入并执行脚本 |
| 依赖条件 | 必须依赖登录状态(Cookie) | 可独立执行,不一定需要登录 |
| 防护方式 | Token、SameSite Cookie | 输入校验、CSP、转义 |
3. CSRF 常见的攻击方式有哪些?
回答要点:
- GET 请求攻击:诱导点击链接、嵌入图片
<img src="http://example.com/transfer?amount=1000"> - POST 表单提交:自动构造表单并提交
- Ajax 请求(如果目标网站没有做 CSRF 防护)
🔐 安全防护相关
4. 如何防御 CSRF 攻击?
回答要点:
-
CSRF Token(最常用方式)
- 每次请求带上一个由后端生成的 token
- 后端验证 token 是否正确
-
SameSite Cookie
- 设置 Cookie 的
SameSite=Strict或Lax - 防止第三方站点携带 Cookie 发起请求
- 设置 Cookie 的
-
Referer 检查
- 检查请求头的 Referer 是否来自合法来源
- 缺点是容易被代理或某些浏览器拦截
-
双重验证机制(如图形验证码或短信)
5. CSRF Token 是如何工作的?
回答要点:
-
后端为每个用户生成唯一 Token(通常保存在 Session 中)
-
前端发送请求时将 Token 加入请求(通常通过请求头或隐藏字段)
-
后端验证:
- Token 是否存在
- Token 是否匹配当前用户的 session
- Token 是否过期
🧪 实战&扩展
6. CSRF Token 如何防止被攻击者窃取?
回答要点:
- 不通过 URL 传输,防止泄漏(如 Referer 泄露)
- 使用 HttpOnly Cookie 存储敏感信息(虽然 token 本身不适合放入 HttpOnly)
7. 在前后端分离项目中,如何防御 CSRF?
回答要点:
- 使用 SameSite Cookie 配合 Token 防御
- 将 CSRF Token 存在 HTTP 头中发送(如
X-CSRF-TOKEN) - 如果是跨域请求,建议使用 JWT 或 OAuth 结合验证码等手段增强安全性
8. 设置 Cookie 的 SameSite 有哪些模式?它们各自代表什么含义?
| SameSite 值 | 说明 |
|---|---|
| Strict | 严格模式,只有从同一站点导航时才会携带 Cookie |
| Lax | 放宽限制,如 GET 请求的链接点击、预加载可以携带 Cookie |
| None | 完全开放,允许跨站携带,但必须配合 Secure(HTTPS)使用 |
9. 举一个简单的 CSRF 攻击实例?
<!-- 攻击者页面中的代码 -->
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker_account">
<input type="hidden" name="amount" value="10000">
<input type="submit" value="点击领取奖品!">
</form>
用户点击后,如果登录了银行账户,则钱被转走。