Web应用中的CSRF防护机制

什么是CSRF攻击?

CSRF (Cross-site request forgery) 跨站请求伪造是一种常见的网络攻击方式。攻击者诱导用户访问已被攻击者控制的网页时,利用用户在被攻击网站已经获取的注册凭证,绕过后台的用户验证,冒充用户对被攻击的网站发起某种操作。

CSRF攻击的特点

  1. 依赖用户已登录目标网站
  2. 利用目标网站对用户浏览器的信任
  3. 欺骗用户的浏览器发送HTTP请求给目标网站
  4. 攻击一般发生在第三方网站上

防护措施

1. 验证 HTTP Referer 字段

javascript 复制代码
// 服务器端验证 Referer
const referer = ctx.request.headers.referer;
if (!referer || !referer.startsWith('https://trusted-domain.com')) {
  ctx.throw(403, 'Invalid referer');
}

优点:

  • 实现简单
  • 兼容性好

缺点:

  • Referer 可能被篡改
  • 某些浏览器可能会禁用 Referer

2. 添加 CSRF Token

javascript 复制代码
// 生成 token
const token = crypto.randomBytes(24).toString('hex');

// 在表单中嵌入 token
<input type="hidden" name="_csrf" value="<%= token %>">

// 服务器端验证
if (req.body._csrf !== req.session.csrf) {
  return res.status(403).json({ message: 'Invalid CSRF token' });
}

优点:

  • 安全性高
  • 完全可控

缺点:

  • 需要在每个表单中添加 token
  • 增加了开发成本
javascript 复制代码
// 设置 Cookie
res.cookie('sessionId', 'abc123', {
  sameSite: 'Strict',  // 或 'Lax'
  secure: true
});

优点:

  • 配置简单
  • 浏览器原生支持

缺点:

  • 浏览器兼容性问题
  • 可能影响某些正常的跨站请求
javascript 复制代码
// 在页面中通过 JavaScript 读取 cookie 中的 csrf_token
const csrfToken = document.cookie.match(/csrf_token=(.*?);/)[1];

// 将 token 添加到请求头
fetch('/api/data', {
  headers: {
    'X-CSRF-Token': csrfToken
  }
});

最佳实践建议

  1. 组合使用多种防护措施
  2. 对重要操作使用验证码或二次确认
  3. 使用 HTTPS 确保传输安全
  4. 定期更新 CSRF Token
  5. 合理设置 Cookie 的作用域和有效期

示例代码:Express 中间件实现 CSRF 防护

javascript 复制代码
const express = require('express');
const csrf = require('csurf');
const cookieParser = require('cookie-parser');

const app = express();

// 解析 Cookie
app.use(cookieParser());

// 启用 CSRF 防护
app.use(csrf({ cookie: true }));

// 错误处理
app.use((err, req, res, next) => {
  if (err.code === 'EBADCSRFTOKEN') {
    res.status(403);
    res.send('CSRF 验证失败');
  } else {
    next(err);
  }
});

// 在表单中注入 token
app.get('/form', (req, res) => {
  res.send(`
    <form action="/submit" method="POST">
      <input type="hidden" name="_csrf" value="${req.csrfToken()}">
      <button type="submit">提交</button>
    </form>
  `);
});

总结

CSRF 攻击虽然危害严重,但通过合理的防护措施可以有效预防。选择合适的防护方案时需要考虑:

  • 系统的安全需求级别
  • 开发维护成本
  • 用户体验影响
  • 浏览器兼容性

建议在实际项目中采用多层防护机制,并根据具体场景选择最适合的防护措施组合。

相关推荐
w***9549几秒前
spring-boot-starter和spring-boot-starter-web的关联
前端
Moment4 分钟前
富文本编辑器技术选型,到底是 Prosemirror 还是 Tiptap 好 ❓❓❓
前端·javascript·面试
xkxnq9 分钟前
第二阶段:Vue 组件化开发(第 18天)
前端·javascript·vue.js
June`10 分钟前
IO模型全解析:从阻塞到异步(高并发的reactor模型)
linux·服务器·网络·c++
晓得迷路了10 分钟前
栗子前端技术周刊第 112 期 - Rspack 1.7、2025 JS 新星榜单、HTML 状态调查...
前端·javascript·html
怕浪猫13 分钟前
React从入门到出门 第五章 React Router 配置与原理初探
前端·javascript·react.js
jinmo_C++13 分钟前
从零开始学前端 · HTML 基础篇(一):认识 HTML 与页面结构
前端·html·状态模式
乾元18 分钟前
如何把 CCIE / HCIE 的实验案例改造成 AI 驱动的工程项目——从“实验室能力”到“可交付系统”的完整迁移路径
大数据·运维·网络·人工智能·深度学习·安全·机器学习
鹏多多20 分钟前
前端2025年终总结:借着AI做大做强再创辉煌
前端·javascript
liulilittle22 分钟前
俄罗斯访问欧洲国际线路优化
开发语言·网络·信息与通信·ip·通信·俄罗斯·莫斯科