# 什么是 CSRF 攻击

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种 Web 安全漏洞,攻击者诱使用户在不知情的情况下,以其已认证的身份向目标网站发送恶意请求。

# 基本工作原理

  1. 用户登录并认证了目标网站(如银行网站)
  2. 用户在同一浏览器中访问了攻击者控制的恶意网站
  3. 恶意网站包含自动向目标网站发送请求的代码
  4. 由于用户已认证,请求会携带用户的认证信息(如 Cookie)
  5. 目标网站无法区分这是用户的合法请求还是攻击者的伪造请求

# 典型攻击示例

假设银行网站的转账接口如下:

GET http://bank.com/transfer?to=攻击者账户&amount=1000

攻击者在恶意网站中插入:

1
2

`<img src="http://bank.com/transfer?to=attacker&amount=1000" width="0" height="0">`

当已登录银行网站的用户访问该恶意页面时,浏览器会自动发送转账请求。

# CSRF 攻击的特点

  1. 依赖用户已认证的状态:利用用户的登录凭证
  2. 跨站点:攻击来自第三方网站
  3. 伪造请求:非用户本意的操作
  4. GET 和 POST 都可能被利用

# 潜在危害

  1. 以用户身份执行敏感操作(转账、改密等)
  2. 修改用户账户信息
  3. 购买商品或服务
  4. 发布内容或消息
  5. 删除或修改数据

# 防御措施

# 1. 使用 CSRF Token(最有效方法)

服务器生成随机 Token 并嵌入表单
提交请求时必须包含有效 Token
Token 与用户会话关联

1
2
3

`<form action="/transfer" method="POST"><input type="hidden" name="_csrf" value="随机生成的Token"><!-- 其他表单字段 -->
</form>`

# 2. 检查 Referer/Origin 头部

  • 验证请求来源是否合法
  • 但某些情况下 Referer 可能被剥离

# 3. SameSite Cookie 属性

  • 限制 Cookie 在跨站请求时发送

Set-Cookie: sessionid=xxxx; SameSite=Strict

  • Strict :完全禁止跨站发送
  • Lax :宽松模式,允许某些安全请求

# 4. 关键操作要求二次验证

  • 重要操作(如转账)需要重新输入密码
  • 使用短信 / 邮件验证码

# 5. 限制敏感操作的 HTTP 方法

  • 只允许 POST 请求执行敏感操作
  • 避免使用 GET 请求修改数据

# CSRF vs XSS 区别

特性 CSRF XSS
攻击目标 利用用户的认证状态 窃取用户数据或会话
执行位置 目标网站 用户浏览器
是否需要用户交互 需要用户访问恶意页面 只需用户访问被注入的页面
防御重点 验证请求来源和意图 过滤输入和编码输出

更新于

请我喝[茶]~( ̄▽ ̄)~*

麻糖 微信支付

微信支付

麻糖 支付宝

支付宝

麻糖 贝贝

贝贝