Web应用中的CSRF防护机制

embedded/2024/12/22 16:00:54/

什么是CSRF攻击?

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

CSRF攻击的特点

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

防护措施

1. 验证 HTTP Referer 字段

// 服务器端验证 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

// 生成 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
  • 增加了开发成本

3. 使用 SameSite Cookie 属性

// 设置 Cookie
res.cookie('sessionId', 'abc123', {sameSite: 'Strict',  // 或 'Lax'secure: true
});

优点:

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

缺点:

  • 浏览器兼容性问题
  • 可能影响某些正常的跨站请求

4. 双重 Cookie 验证

// 在页面中通过 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 防护

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

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

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


http://www.ppmy.cn/embedded/147863.html

相关文章

Linux中部署项目

1.下载JDK17 进入 /usr/local 目录&#xff0c;创建 java 文件夹。并将 JDK17 上传到 java 目录下。 上传成功后&#xff0c;通过cd命令进入Java文件夹目录&#xff0c;解压 JDK17 压缩包&#xff0c;命令 unzip zulu17.44.53-ca-jdk17.0.8.1-linux_x64.zip。 如果报错说 u…

蓝叠模拟器adb连接并配置网络代理

说在前面&#xff1a; 由于配置wsl导致原模拟器失效&#xff0c;选择了蓝叠模拟器&#xff08;下载安装器后会自动配置为Hyper-v版本&#xff09;蓝叠国际不能自动配置root&#xff0c;需要手动破解&#xff0c;此处选择的是蓝叠中国&#xff08;二者可以同时安装并共存&#…

端口聚合配置

配置端口聚合 本文中端口聚合配置任务描述了如何配置以太网端口聚合。 概述 端口聚合&#xff0c;即将几个属性相同的物理端口聚合绑定到一起形成一个逻辑上的通道。端口的聚合方式可以是将几个物理端口静态的聚合到一起而不管与这些物理端口相连的端口是否符合聚合的条件&a…

Flutter组件————BottomNavigationBar

BottomNavigationBar 是Flutter中用于在屏幕底部显示导航栏的组件&#xff0c;它允许用户在几个主要视图之间进行切换。 参数 参数名类型描述itemsList定义导航栏中的每个项目&#xff0c;通常包含图标和标签。onTapValueChanged当用户点击导航栏中的项目时触发的回调函数&am…

MATLAB深度学习实战PCB缺陷检测

本文采用YOLO作为核心算法框架&#xff0c;结合Matlab构建用户界面&#xff0c;使用MATLAB进行开发。YOLO以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对PCB电路板缺陷数据集进行训练和优化&#xff0c;该数据集包含丰富的PCB电路板缺陷图…

解决Apache/2.4.39 (Win64) PHP/7.2.18 Server at localhost Port 80问题

配置一下apache里面的配置文件&#xff1a;httpd.conf 和 httpd.vhosts.conf httpd.conf httpd-vhosts.conf 重启服务 展示&#xff1a; 浏览器中中文乱码问题&#xff1a;

AI呼入机器人详解

AI呼入机器人详解 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc AI呼入机器人&#xff0c;也称为智能客服系统或虚拟客服助手&#xff0c;是利用人工智能技术来自动处理和响应客户来电的解决方案。这类机器人…

*【每日一题 基础题】 [蓝桥杯 2023 省 B] 飞机降落

题目描述 N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 Di 个单位时间&#xff0c;即它最早可以于 Ti 时刻开始降落&#xff0c;最晚可以于 Ti Di 时刻开始降落。降落过程需要 Li个单位时间…