deepwzh的技术笔记
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • 杂项
  • Windows UI 自动化方案调研 (2026)v2
  • Nginx
  • 首页
  • Protobuf
  • 学习资料
  • 杂项
  • Ldap
  • 编译原理
  • 分布式

    • 分布式
    • Raft 算法
  • 开发工具

    • 开发工具
    • cloc
    • Vscode
    • 工具箱
    • Visual Studio

      • Visual Studio
      • C++ 相关
      • Visual Studio 基本知识
  • 软件设计

    • 软件设计
    • MVC
    • 领域驱动设计
    • PO、DO、DTO、VO
    • 高内聚低耦合
  • 消息队列

    • 消息队列
    • Celery
    • Kafka
    • RabbitMQ
  • 设计模式

    • 设计模式
    • 控制反转和依赖注入
    • 七大原则
  • 网络安全

    • 网络安全
    • 请求签名
    • CSRF
    • XSS
  • 版本管理工具

    • 版本管理工具
    • Git

      • Git
      • Git get 私有仓库报错
      • Github 加速
      • Clone
      • Git pull 出现 hint 时的解决方案
      • 修改提交记录的作者信息
      • Git mergr
  • 组成原理

    • 组成原理
    • CPU

CSRF

攻击原理

如上图所示,简单地说,就是攻击网站内部 B 嵌入了对被攻击网站 A 的请求。如果 A 已经是登录状态,且请求时携带了自身的 cookie 信息,A 网站可能会认为 B 中发起对 A 网站的请求也是一个合理请求,从而进行相应。

攻击网站构造的请求可能是嵌入在 img 中,也可能是自动执行的脚本,GET 形式的请求较为常见,不过也会有 POST 形式的请求。

危害

会发起用户预期之外的请求,如对银行网站会造成意料之外的消费

防范方法

token 校验

服务端渲染浏览器表单的时候,在一个 hidden 字段中嵌入一个随机的 token 值,当接收到请求后,服务端会对这个 token 进行校验。

攻击网站无法获取到这个 token,因此也就没法通过表单校验了

Refer 头校验

HTTP 请求头中的 Refer 会记录请求发起 URL 地址,如果请求是在 B 网站发出的,则记录的 Refer 则会记录 B 的 URL,服务端可以判断这个字段值是否属于 A 的地址,来决定是否接受该请求。

一般可以把 Refer 头的校验统一放入中间件即可

不过要注意 Refer 是否能被篡改的问题,现代浏览器似乎都不容易被篡改了

Cookie samesite 选项

chrome 较新的版本已经引入了 samesite 选项。其作用是决定第三方网站发起的请求是否进行禁用。

其有三个选项:

  • Strict
  • Lax
  • None

Strict: 完全禁止第三方 Cookie

Lax: 部分禁止第三方 Cookie

None: 不禁止第三方 Cookie,但必须与 Secure 选项搭配(即要求 Cookie 必须通过 HTTPS 协议发送)

具体信息如下表所示

当浏览器支持了这个特性,只要我们设置了

Set-Cookie: CookieName=CookieValue; SameSite=Strict;

便可以杜绝 CSRF 攻击

Prev
请求签名
Next
XSS