侧边栏壁纸
博主头像
colo

欲买桂花同载酒

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

什么是CSRF攻击?列举两种常见的防御方法

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

题目

什么是CSRF攻击?列举两种常见的防御方法

信息

  • 类型:问答
  • 难度:⭐

考点

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

快速回答

CSRF(跨站请求伪造)是一种恶意攻击,攻击者诱导用户在已登录的Web应用中执行非预期的操作。

主要防御方法:

  • 同步令牌(CSRF Token):服务器生成随机Token嵌入表单或请求头,验证请求合法性
  • SameSite Cookie属性:设置Cookie的SameSite属性为Strict或Lax,限制跨域发送Cookie
## 解析

一、原理说明

CSRF攻击利用浏览器自动携带Cookie的特性:

  1. 用户登录可信网站A,服务器返回包含身份验证的Cookie
  2. 用户未登出时访问恶意网站B
  3. 网站B的页面包含向网站A发请求的代码(如隐藏表单)
  4. 浏览器自动携带网站A的Cookie发送请求,导致在用户不知情时执行操作(如转账)

CSRF攻击流程图

二、代码示例

攻击示例(恶意表单):

<!-- 恶意网站上的隐藏表单 -->
<form action="https://bank.com/transfer" method="POST">
  <input type="hidden" name="amount" value="1000">
  <input type="hidden" name="to" value="attacker_account">
  <input type="submit" value="点击领红包">
</form>
<script>document.forms[0].submit()</script>  // 自动提交

防御示例(同步令牌):

// 服务端生成Token(Node.js示例)
app.use((req, res, next) => {
  res.locals.csrfToken = crypto.randomBytes(16).toString('hex');
  next();
});

// 前端嵌入Token
<form action="/transfer" method="POST">
  <input type="hidden" name="_csrf" value="<%= csrfToken %>">
  ...
</form>

// 服务端验证
app.post('/transfer', (req, res) => {
  if(req.body._csrf !== req.session.csrfToken) {
    return res.status(403).send('CSRF验证失败');
  }
  // 处理正常请求
});

三、最佳实践

  • 同步令牌(推荐)
    • 为每个用户会话生成唯一Token
    • Token需足够随机(如使用密码学安全随机数)
    • 将Token嵌入表单隐藏域或HTTP请求头(如X-CSRF-Token)
  • SameSite Cookie
    • 设置Cookie:Set-Cookie: sessionId=abc123; SameSite=Lax; HttpOnly
    • Strict:完全禁止跨站携带Cookie
    • Lax(平衡选择):允许安全HTTP方法(GET)的跨站请求携带Cookie
  • 关键操作二次验证:敏感操作(如支付)要求重新输入密码

四、常见错误

  • 仅依赖Referer验证:Referer可能被篡改或缺失(HTTP->HTTPS跳转)
  • GET请求修改状态:GET请求不应执行写操作,避免被<img>标签触发
  • Token存储不当:将Token存在Cookie而非Session中,可能被XSS窃取
  • SameSite=None:错误配置为None且未加Secure属性,导致防御失效

五、扩展知识

  • CSRF vs XSS
    • XSS:在目标网站注入恶意脚本,窃取数据
    • CSRF:利用用户登录态,伪造请求执行操作
  • 同源策略(SOP):浏览器安全基础,但允许跨域嵌入资源(如图片、表单),CSRF利用此特性
  • 防御组合:实际项目中应同时使用CSRF Token + SameSite + 敏感操作验证