跨站请求伪造(CSRF)及防护机制

发布于:2025-09-02 ⋅ 阅读:(23) ⋅ 点赞:(0)

跨站请求伪造(CSRF)及防护机制

什么是 CSRF?

跨站请求伪造(Cross-Site Request Forgery) 是一种常见的网络攻击方式,攻击者诱导用户在已登录目标网站的情况下,访问攻击者控制的恶意页面,利用用户的身份凭证(如 Cookie)向目标网站发送非预期请求,从而执行未授权操作(如转账、修改密码等)。

攻击流程示例:

  1. 用户登录银行网站(bank.com),浏览器保存登录 Cookie
  2. 用户未退出银行网站,又访问了攻击者的恶意网站(evil.com
  3. 恶意网站自动发送请求到 bank.com/transfer?to=attacker&amount=1000
  4. 银行网站收到请求,因浏览器自动携带登录 Cookie 而误认为是用户本人操作,执行转账

CSRF 攻击的关键条件

  1. 用户已登录目标网站(存在有效的身份凭证)
  2. 攻击者能构造合理的请求(了解目标网站的接口格式)
  3. 用户在登录状态下访问恶意页面(触发攻击请求)

如何防护 CSRF 攻击?

1. 令牌验证机制(最常用)

  • 原理:服务器生成随机令牌(CSRF Token),每次请求必须携带该令牌,服务器验证令牌有效性
  • 实现方式
    • 令牌存储在 Session 或 Cookie 中
    • 前端请求时从 Session 或 Cookie 中获取令牌,通过表单字段或请求头传递
    • 服务器对比请求中的令牌与存储的令牌是否一致

2. SameSite Cookie 属性

  • 在 Cookie 中设置 SameSite=StrictSameSite=Lax
    • Strict:完全禁止跨站请求携带 Cookie
    • Lax:仅允许安全的跨站请求(如 GET 方式的导航)携带 Cookie
  • 示例:Set-Cookie: sessionid=xxx; SameSite=Strict

3. 验证 Referer/Origin 请求头

  • 检查请求的 RefererOrigin 头,确认请求来自可信域名
  • 局限性:部分浏览器可能不发送 Referer,或可被伪造

4. 双重提交 Cookie

  • 客户端请求时,同时在 Cookie 和请求参数中携带相同的令牌
  • 服务器验证两者是否一致,且令牌由客户端生成(减轻服务器存储压力)

5. Spring Security 中的 CSRF 防护

如之前的代码示例,Spring Security 内置 CSRF 防护机制:

  • 自动生成和验证令牌
  • 支持多种令牌存储方式(Session/Cookie)
  • 可灵活配置需要防护的路径

不适用 CSRF 防护的场景

  1. 纯 API 服务(使用 JWT 等无状态认证,且不依赖 Cookie)
  2. 内部系统(无跨站访问风险)
  3. 仅支持 GET 方法的查询接口(无状态修改操作)

总结

CSRF 攻击利用用户的身份凭证执行未授权操作,防护的核心是确保请求确实来自用户的主动意愿。令牌验证机制是目前最可靠的防护手段,结合 SameSite Cookie 等辅助措施可大幅降低风险。在实际开发中,建议使用 Spring Security 等成熟框架的内置功能,避免重复开发。


网站公告

今日签到

点亮在社区的每一天
去签到