侧边栏壁纸
博主头像
colo

欲买桂花同载酒

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

什么是CSRF攻击?如何防御?

2025-12-12 / 0 评论 / 6 阅读

题目

什么是CSRF攻击?如何防御?

信息

  • 类型:问答
  • 难度:⭐

考点

CSRF概念,攻击原理,防御措施

快速回答

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

  • 使用CSRF Token验证请求来源
  • 设置Cookie的SameSite属性为Strict或Lax
  • 关键操作增加二次验证(如密码确认)
## 解析

原理说明

CSRF攻击原理:当用户登录网站A后,恶意网站B诱导用户点击链接或加载资源,利用浏览器自动携带Cookie的特性,以用户身份在网站A执行非预期操作(如转账、改密码)。攻击流程:

  1. 用户登录信任网站A,获得身份Cookie
  2. 用户访问恶意网站B,B页面包含指向A的恶意请求
  3. 浏览器自动携带A的Cookie发送请求
  4. 网站A误认为是用户合法操作

代码示例

攻击示例(恶意表单):

<!-- 恶意网站B的页面 -->
<form action="https://bank.com/transfer" method="POST">
  <input type="hidden" name="amount" value="1000">
  <input type="hidden" name="to" value="hacker">
  <input type="submit" value="点击抽奖">
</form>

防御示例(添加CSRF Token):

<!-- 服务端生成Token存入session -->
<?php $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); ?>

<!-- 前端表单携带Token -->
<form action="/transfer" method="POST">
  <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
  <!-- 其他表单字段 -->
</form>

<!-- 服务端验证 -->
<?php
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
  die("CSRF token validation failed");
}
?>

最佳实践

  • CSRF Token:为每个用户会话生成唯一Token,包含在表单或AJAX请求头中
  • SameSite Cookie:设置关键Cookie的SameSite属性(推荐Strict)
  • 敏感操作防护:重要操作(如支付)要求二次验证
  • 框架内置防护:使用现代框架(如Spring Security、Django CSRF中间件)

常见错误

  • 仅依赖Referer检查(可能被篡改或缺失)
  • Token未绑定用户会话或未及时过期
  • GET请求执行写操作(应严格遵循REST规范)
  • 在JSON API中忽略CSRF防护(需在请求头添加Token)

扩展知识

  • SameSite级别
    • Strict:完全禁止第三方Cookie
    • Lax:允许安全跨站链接(默认值)
    • None:允许所有跨站Cookie(需配合Secure属性)
  • 双重提交Cookie:将Token同时放在Cookie和请求参数中,验证一致性
  • 同源策略:浏览器安全基础,但CSRF利用其Cookie规则漏洞