侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

解释CSRF攻击原理及基础防御方法

2025-12-11 / 0 评论 / 8 阅读

题目

解释CSRF攻击原理及基础防御方法

信息

  • 类型:问答
  • 难度:⭐

考点

CSRF攻击原理,防御措施,安全机制理解

快速回答

CSRF(跨站请求伪造)是一种恶意利用用户已登录状态发起非预期请求的攻击方式。核心防御方法:

  • 使用CSRF Token验证请求来源
  • 关键操作检查Referer/Origin头
  • 敏感操作要求二次验证(如密码确认)
## 解析

一、攻击原理

CSRF(Cross-Site Request Forgery)攻击流程:

  1. 用户登录信任网站A,获得有效会话Cookie
  2. 用户访问恶意网站B,该网站包含伪造请求代码
  3. 浏览器自动携带网站A的Cookie向网站A发起请求
  4. 网站A误认为是用户合法操作执行请求(如转账)

示例攻击代码(恶意网站B):

<!-- 隐藏表单自动提交 -->
<form action="https://bank.com/transfer" method="POST">
  <input type="hidden" name="amount" value="10000">
  <input type="hidden" name="to" value="hacker">
</form>
<script>document.forms[0].submit()</script>

二、防御措施

1. CSRF Token(最有效)

服务端生成随机Token绑定用户会话:

// 服务端生成Token(示例伪代码)
const csrfToken = generateRandomToken();
storeInSession(userSession, csrfToken);

// 在表单中嵌入Token
<form action="/transfer" method="POST">
  <input type="hidden" name="csrf_token" value="${csrfToken}">
  ...
</form>

// 验证请求(服务端)
function handleRequest(req, res) {
  if(req.body.csrf_token !== getFromSession(req.session)) {
    return res.status(403).send("Invalid CSRF Token");
  }
  // 处理合法请求
}

2. 检查HTTP头

  • Referer/Origin验证:检查请求来源域名是否在白名单内
  • SameSite Cookie属性:设置Cookie为SameSite=Lax/Strict

3. 关键操作二次验证

敏感操作(如支付)要求:

  • 重新输入密码
  • 短信/邮箱验证码

三、最佳实践

  • 对所有状态修改请求(POST/PUT/DELETE)使用CSRF Token
  • Token需满足:
    • 随机不可预测(至少128位)
    • 绑定用户会话
    • 单次有效(或短时效)
  • 组合使用SameSite=Lax+Token提供纵深防御

四、常见错误

  • 仅对GET请求做防护(CSRF可触发POST请求)
  • Token存储在Cookie而非Session中
  • Token未绑定具体用户(如全局统一Token)
  • 依赖Referer头但未处理空Referer情况

五、扩展知识

  • 双重提交Cookie:前端从Cookie读取Token并放入请求头
  • 框架内置方案:Django的{% csrf_token %}、Spring Security的CsrfFilter
  • 与XSS区别:XSS利用站点漏洞注入脚本,CSRF利用用户登录状态