当前位置: 首页 > news >正文

SpringSecurity当中的CSRF防范详解

CSRF防范

什么是CSER

以下是基于 CSRF 攻击过程的 顺序图 及详细解释,结合多个技术文档中的攻击流程:


CSRF 攻击顺序图

用户 浏览器 受信任网站A 恶意网站B 正常操作阶段 访问网站A并登录 发送登录请求 返回登录成功的Cookie 存储Cookie(保持会话) 攻击触发阶段 访问恶意网站B(如点击链接) 请求页面 返回包含恶意代码的页面(如自动提交表单的JS) 伪造请求执行阶段 自动携带Cookie发送恶意请求(如转账) 验证Cookie合法,执行请求 用户未感知到操作已被篡改 用户 浏览器 受信任网站A 恶意网站B

攻击过程分步解读

  1. 用户登录受信任网站A
    • 用户通过浏览器正常登录网站A(例如银行网站),服务器生成会话 Cookie 并返回给浏览器。

• 关键点:此时浏览器会存储该 Cookie,后续所有对网站A的请求都会自动携带此 Cookie(如 Set-Cookie: session_id=abc123)。

  1. 用户访问恶意网站B
    • 攻击者通过钓鱼链接、诱导广告等方式,诱使用户访问恶意网站B。

• 攻击代码示例(来自网页3):

<!-- 恶意网站B的页面 -->
<img src="http://网站A/转账?to=攻击者&amount=1000">
<!-- 或通过JS自动提交表单 -->
<script>document.write('<form action="http://网站A/改密码" method="POST">');document.write('<input type="hidden" name="new_password" value="hacker123">');document.write('</form>');document.forms[0].submit();
</script>
  1. 浏览器自动发送伪造请求
    • 恶意网站B的代码会触发浏览器向网站A发送请求(如转账、修改密码),浏览器会自动携带用户已登录的 Cookie。

• 服务器视角:网站A收到请求后,验证 Cookie 合法,误认为是用户主动操作,执行恶意请求。

  1. 攻击完成
    • 用户未感知到任何异常(如无页面跳转),但敏感操作已被执行(如资金转移、密码重置)。

攻击成功的关键条件

  1. 用户已登录受信任网站A:攻击依赖用户的活跃会话。
  2. 网站A未启用CSRF防护:如未校验 Token、Referer 或二次验证。
  3. 请求参数可预测:例如通过 GET 请求执行敏感操作(如 GET /转账?to=攻击者)。

防御措施(引用自网页5、网页6)

• Token 验证:在表单或请求头中嵌入随机 Token,服务端校验 Token 合法性。

• SameSite Cookie:设置 Cookie 的 SameSite=Strict/Lax 属性,限制跨域请求携带 Cookie。

• Referer 检查:验证请求来源是否为可信域名。


通过顺序图可以看出,CSRF 攻击的 核心逻辑是滥用浏览器的 Cookie 自动携带机制,而防御的关键在于 阻断攻击者伪造请求的能力。

Security的CSRF简介

根据 Spring Security 的官方设计理念及社区实践(综合多个技术文档和博客),其 CSRF 防护机制的核心逻辑如下:


一、Spring Security 的 CSRF 防护机制

  1. 默认启用的防护
    • 自动拦截:Spring Security 从 4.0 版本起默认启用 CSRF 保护,通过 CsrfFilter 拦截所有非安全 HTTP 方法(如 POST、PUT、DELETE)的请求。

• Token 验证流程:

  1. 生成 Token:用户首次访问时,服务端生成唯一的 CSRF Token 并存储于 HttpSessionCookie 中(默认使用 HttpSessionCsrfTokenRepository)。

  2. 客户端携带 Token:在表单或 AJAX 请求中必须包含该 Token(例如通过隐藏字段或请求头)。

  3. 服务端校验:请求到达时,CsrfFilter 会对比客户端提交的 Token 与服务端存储的 Token,若不一致则拒绝请求(返回 403 错误)。

  4. 核心组件
    CsrfToken 接口:定义 Token 的生成规则,包含 token 值、参数名(_csrf)和请求头名(X-CSRF-TOKEN)。

CsrfTokenRepository

HttpSessionCsrfTokenRepository(默认):Token 存储于 Session。

CookieCsrfTokenRepository:Token 存储于 Cookie,适用于前后端分离场景。

• 配置示例:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());}
}
  1. 前端集成方式
    • 表单页面:通过模板引擎(如 Thymeleaf)自动注入 Token:
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

• AJAX 请求:从 Cookie 或 Meta 标签获取 Token 并添加到请求头:

// 从 Cookie 获取 Token(需配置 CookieCsrfTokenRepository)
const token = document.cookie.match(/XSRF-TOKEN=([^;]+)/)[1];
fetch('/api/data', {method: 'POST',headers: { 'X-XSRF-TOKEN': token }
});
  1. 扩展防护策略
    • SameSite Cookie 属性:通过设置 Cookie 的 SameSite=Strict/Lax,限制跨域请求携带 Cookie(需浏览器支持)。

• 二次验证:对敏感操作(如转账)叠加验证码或密码确认。


二、未启用 CSRF 防护的危害场景

如果未启用 CSRF 防护,攻击者可利用以下漏洞发起攻击:

  1. 伪造用户操作:
    • 自动触发恶意请求:通过恶意页面嵌入 <img> 或自动提交表单,诱导已登录用户触发转账、修改密码等操作。

    • 示例攻击代码:

    <img src="http://bank.com/transfer?to=attacker&amount=10000">
    
  2. 数据篡改与泄露:
    • 账户信息泄露:攻击者篡改用户邮箱或手机号,后续可通过“忘记密码”功能接管账户。

    • 业务逻辑绕过:例如自动关注陌生账号、删除用户数据等。

  3. 企业级风险:
    • 供应链攻击:通过管理员账户的 CSRF 漏洞植入后门,导致企业系统被渗透。

    • 合规风险:因数据泄露违反 GDPR 等法规,面临高额罚款。


三、官方文档的补充说明

虽然未直接引用 spring.io 官网,但以上机制与官方文档一致(可通过 Spring Security 官方文档 验证):
• 防护原理:基于 Token 的同步器模式(Synchronizer Token Pattern)。

• 禁用场景:仅推荐在纯 API 服务(无浏览器交互)时通过 http.csrf().disable() 关闭防护。


总结
Spring Security 通过 CSRF Token 的生成与验证机制 有效防御跨站请求伪造攻击。若未启用防护,攻击者可利用用户已登录的会话劫持敏感操作,导致数据泄露、资金损失等严重后果。开发者应结合业务场景选择 Token 存储方式(Session/Cookie),并确保前端正确集成 Token。

CSRF防范的必要参数

以下是标准的CSRF防护参数及其生成、使用和失效规则的总结表格,结合多个技术文档和实践案例:

参数名称生成者生成时机使用时机失效条件
CSRF Token服务端用户首次访问受保护页面时生成在提交表单或发起状态变更请求(如POST/PUT/DELETE)时携带会话过期失效、单次使用后失效(单次有效性)、超出时间窗口(如5-10分钟)
SameSite Cookie服务端用户首次登录时生成浏览器自动管理,用于限制跨域请求携带CookieCookie过期失效、浏览器关闭(根据SameSite策略)
二次验证参数服务端或第三方系统用户触发敏感操作(如转账)时生成执行关键操作前需二次验证(如短信验证码)验证码使用后失效、超时失效(如5分钟)

详细说明

  1. CSRF Token
    • 生成者:服务端通过CsrfTokenRepository生成,例如HttpSessionCsrfTokenRepository(存储在会话中)或CookieCsrfTokenRepository(存储在Cookie)。

• 生成时机:用户首次访问需要CSRF防护的页面时(如登录页、表单页),或每次页面加载时动态生成新Token。

• 使用时机:必须嵌入到所有非安全方法(POST/PUT/DELETE)的请求中,例如:

• 表单:通过隐藏字段<input type="hidden" name="_csrf" value="token">

• AJAX:通过请求头X-CSRF-TOKENX-XSRF-TOKEN传递。

• 失效条件:

• 会话过期:若用户会话终止,Token随之失效。

• 单次有效性:部分系统设计Token仅限单次使用(如支付场景)。

• 时间窗口:设置Token有效期(如10分钟),超时自动失效。

  1. SameSite Cookie
    • 生成者:服务端在用户登录时生成会话Cookie,并设置SameSite属性。

• 使用规则:

SameSite=Strict:禁止跨域请求携带Cookie(适用于高敏感操作)。

SameSite=Lax:允许安全跨域请求(如导航链接的GET请求)。

• 失效条件:遵循Cookie的过期策略(如会话Cookie在浏览器关闭后失效)。

  1. 二次验证参数
    • 生成者:服务端在用户触发敏感操作时生成(如短信验证码、动态口令)。

• 使用时机:关键操作(如修改密码、大额转账)前需用户二次确认。

• 失效条件:验证码使用后立即失效,或设计为短时间有效(如5分钟)。


引用来源
• CSRF Token生成与验证逻辑:

• SameSite Cookie机制:

• 二次验证参数设计:

通过上述参数组合(如Token+SameSite+二次验证),可构建多层防御体系,有效阻断CSRF攻击。

Security是怎么防范的

Spring Security 通过 CSRF Token 验证机制 和 防御策略组合 来避免 CSRF 攻击,以下是其核心实现逻辑及关键步骤:


一、CSRF Token 验证机制

  1. 生成与存储 Token
    • Token 生成:当用户首次访问受保护页面时,Spring Security 会自动生成一个唯一的随机 CSRF Token。

• 默认使用 HttpSessionCsrfTokenRepository,将 Token 存储在用户会话(HttpSession)中。

• 若为前后端分离架构,可使用 CookieCsrfTokenRepository 将 Token 存储于 Cookie 中,并允许前端通过 JavaScript 读取。

• Token 结构:包含三个核心属性:token(随机值)、parameterName(参数名,默认为 _csrf)、headerName(请求头名,默认为 X-CSRF-TOKEN)。

  1. 客户端携带 Token
    • 表单提交:

在 HTML 表单中通过隐藏字段嵌入 Token。例如使用 Thymeleaf 模板引擎自动注入:

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

• AJAX 请求:

通过请求头传递 Token。前端需从 Cookie 或 Meta 标签中获取 Token,并添加到请求头中:

// 从 Cookie 获取 Token(需配置 CookieCsrfTokenRepository)
const token = document.cookie.match(/XSRF-TOKEN=([^;]+)/)[1];
fetch('/api/data', {method: 'POST',headers: { 'X-XSRF-TOKEN': token }
});
  1. 服务端验证 Token
    • 拦截与校验:

CsrfFilter 会拦截所有非安全 HTTP 方法(如 POST、PUT、DELETE),从请求中提取 Token,并与服务端存储的 Token 对比。
• 若 Token 匹配,请求通过。

• 若 Token 缺失或不匹配,返回 403 Forbidden 错误。


二、防御策略扩展

  1. SameSite Cookie 属性
    • 通过设置 Cookie 的 SameSite 属性限制跨域请求携带 Cookie:

SameSite=Strict:仅允许同站点请求携带 Cookie。

SameSite=Lax:允许部分安全跨站点请求(如导航链接)。

• 配置示例:

@Bean
public CsrfTokenRepository csrfTokenRepository() {CookieCsrfTokenRepository repository = new CookieCsrfTokenRepository();repository.setSameSite("Lax");return repository;
}
  1. 双重验证(Double Submit Cookie)
    • 服务端将 Token 同时存储在 Cookie 和表单/请求头中,验证时需两者一致。

• 适用于分布式系统,避免依赖会话存储。

  1. 安全方法限制
    • 默认仅对 POST、PUT、DELETE、PATCH 等状态修改类请求启用 CSRF 验证,而 GET、HEAD、OPTIONS 等安全方法无需验证。

三、配置与最佳实践

  1. 启用与禁用
    • 默认启用:Spring Security 4.0+ 默认开启 CSRF 防护。

• 手动关闭(不推荐):

http.csrf().disable();
  1. 前后端分离配置
    • 后端配置 Cookie 存储 Token:
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

• 前端从 Cookie 读取 Token 并添加到请求头。

  1. 最佳实践
    • 始终启用 CSRF 防护:除非服务为纯 API 且无浏览器交互。

• 结合 HTTPS:防止 Token 被中间人窃取。

• 定期更新依赖:修复已知漏洞。


四、总结

Spring Security 通过 CSRF Token 的生成、传递与验证机制,结合 SameSite Cookie 和 双重验证 等策略,有效阻断攻击者伪造请求的能力。其设计兼顾灵活性与安全性,开发者需根据架构(如传统 MVC 或前后端分离)选择合适的 Token 存储方式,并遵循最佳实践以确保全面防护。

相关文章:

SpringSecurity当中的CSRF防范详解

CSRF防范 什么是CSER 以下是基于 CSRF 攻击过程的 顺序图 及详细解释&#xff0c;结合多个技术文档中的攻击流程&#xff1a; CSRF 攻击顺序图 #mermaid-svg-FqfMBQr8DsGRoY2C {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#m…...

CSRF防范歪招

不保存到Cookie里呗 如果每次请求都强制通过请求头携带Token&#xff0c;并且不将Token存储在Cookie中&#xff0c;这种设计可以有效防御CSRF攻击。以下是具体原因和关键实现要点&#xff1a; 1. 防御原理 CSRF攻击的本质是攻击者伪造用户的请求&#xff0c;利用浏览器自动携…...

MyBatis与MyBatis-Plus深度分析

MyBatis与MyBatis-Plus深度分析 一、MyBatis原理与基础 1. MyBatis核心原理 MyBatis是一个半自动ORM框架&#xff0c;主要原理包括&#xff1a; SQL与代码分离&#xff1a;通过XML或注解配置SQL语句动态SQL&#xff1a;提供if、choose、foreach等标签实现动态SQL结果集映射…...

STM32 变量加载到flash的过程中

在STM32中&#xff0c;BIN文件内需要加载到RAM的数据由链接脚本&#xff08;Linker Script&#xff09;​和启动代码&#xff08;Startup Code&#xff09;​共同决定&#xff0c;具体机制如下&#xff1a; 一、BIN文件内容结构 STM32的BIN文件包含三类数据&#xff1a; ​Co…...

TCP核心机制

1. TCP五大核心机制 1.1. 顺序问题&#xff08;稳重不乱&#xff09; 背景&#xff1a;网络传输中数据包可能因路径不同或网络波动导致乱序到达&#xff0c;需保证接收方能按正确顺序处理数据。 原理&#xff1a; 序列号&#xff08;Sequence Number&#xff09;&#xff1…...

6.3对象序列化

在 Java 中&#xff0c;ObjectInputStream 和 ObjectOutputStream 是用于实现对象序列化&#xff08;Serialization&#xff09;和反序列化&#xff08;Deserialization&#xff09;的核心类。通过这两个类&#xff0c;可以将对象转换为字节流进行存储或传输&#xff0c;并在需…...

Flutter小白入门指南

Flutter小白入门指南 &#x1f680; 轻松构建漂亮的跨平台应用 &#x1f4d1; 目录 一、Flutter是什么&#xff1f; 为什么选择Flutter&#xff1f;Flutter工作原理 二、环境搭建与命令行 安装Flutter SDK常用Flutter命令创建第一个项目 三、Flutter基础语法 变量与类型函数条…...

Python -将MP4文件转为GIF图片

给大家提供一个工具代码&#xff0c;使用Python&#xff0c;将MP4格式的视频文件&#xff0c;转换为GIF图片 首先先安装必要的包&#xff1a; pip install imageio pip install imageio[ffmpeg] 工具代码&#xff1a; import imageio# 视频文件路径 video_path r""…...

51c嵌入式~电路~合集27

我自己的原文哦~ 一、7805应用电路 简介 如上图&#xff0c;7805 集成稳压电路。 7805是串联式三端稳压器&#xff0c;三个端口分别是电压输入端&#xff08;IN&#xff09;&#xff0c;地线&#xff08;GND&#xff09;&#xff0c;稳压输出&#xff08;OUT&#xff09;…...

数据结构—(链表,栈,队列,树)

本文章写的比较乱&#xff0c;属于是缝合怪&#xff0c;很多细节没处理&#xff0c;显得粗糙&#xff0c;日后完善&#xff0c;今天赶时间了。 1. 红黑树的修复篇章 2. 红黑树的代码理解&#xff08;部分写道注释之中了&#xff09; 3. 队列与栈的代码 4. 重要是理解物理逻辑&a…...

GitHub 趋势日报 (2025年05月12日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1harry0703/MoneyPrinterTurbo利用ai大模型&#xff0c;一键生成高清短视频使用…...

ebook2audiobook开源程序使用动态 AI 模型和语音克隆将电子书转换为带有章节和元数据的有声读物。支持 1,107+ 种语言

​一、软件介绍 文末提供程序和源码下载 ebook2audiobook开源程序使用动态 AI 模型和语音克隆将电子书转换为带有章节和元数据的有声读物。支持 1,107 种语言。从电子书到带有章节和元数据的有声读物的 CPU/GPU 转换器&#xff0c;使用 XTTSv2、Bark、Vits、Fairseq、YourTTS …...

《算法导论(第4版)》阅读笔记:p39-p48

《算法导论(第4版)》学习第 13 天&#xff0c;p39-p48 总结&#xff0c;总计 10 页。 一、技术总结 1. recurrence/recurrence equation 书里面 recurrence(递归式) 和 recurrence equation(递归方程) 指的是同一个东西。 二、英语总结(生词&#xff1a;2) 1. squint (1)…...

c语言第一个小游戏:贪吃蛇小游戏07

贪吃蛇吃饭喽 所谓贪吃蛇的食物&#xff0c;也就是创建一个和蛇身一样的结构体&#xff0c;只是这个结构体不是链表&#xff0c;也是将这个结构体设置hang和lie坐标&#xff0c;放进gamepic进行扫描&#xff0c;扫到了就也是做操作将 ## 打出来 #include <curses.h> #i…...

(七)深度学习---神经网络原理与实现

分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.神经网络原理概述 二.神经网络的训练方法 三.基于Ker…...

VSCode中Node.js 使用教程

一、visual studio code下载与安装 二、修改vscode主题颜色 三、汉化 菜单view-->Command Palette...,输入Configure Display Language。 重启之后如下&#xff1a; 四、安装node.js Node.js 是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;使用了事件驱动、非阻…...

web 自动化之 KDT 关键字驱动详解

一、什么是关键字驱动&#xff1f; 1、什么是关键字驱动&#xff1f;&#xff08;以关键字函数驱动测试&#xff09; 关键字驱动又叫动作字驱动&#xff0c;把项目业务封装成关键字函数&#xff0c;再基于关键字函数实现自动化测试 2、关键字驱动测试原理 关键字驱动测试是一…...

web 自动化之 yaml 数据/日志/截图

文章目录 一、yaml 数据获取二、日志获取三、截图 一、yaml 数据获取 需要安装 PyYAML 库 import yaml import os from TestPOM.common import dir_config as Dirdef read_yaml(key,file_name"test_datas.yaml"):file_path os.path.join(Dir.testcases_dir, file_…...

基于javaweb的SpringBoot酒店管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

数学复习笔记 6

前言 复习一下行列式的一些基本的题。感觉网课有点没跟上了。今天花点时间跟上网课的进度。要紧跟进度&#xff0c;然后剩下的时间再去复习前面的内容。多复习&#xff0c;提升自己的解题能力。 行列式和矩阵 三年级&#xff0c;我现在是三年级下册。。。马上就要结束大学的…...

JS Map使用方法

JS Map使用方法 Map 是 ES6 引入的一种新的数据结构&#xff0c;它类似于对象&#xff08;Object&#xff09;&#xff0c;但提供了更强大的键值对存储功能。 文章目录 JS Map使用方法基本特性基本用法创建 Map常用方法遍历方法 与 Object 的区别实际应用示例示例1&#xff1a…...

大模型分布式光伏功率预测实现详解

一、引言 随着全球能源结构向可再生能源转型,光伏发电作为清洁能源的重要组成部分,其装机容量持续快速增长。然而,光伏发电具有显著的间歇性和波动性特点,给电力系统的稳定运行带来了巨大挑战。准确的光伏功率预测对于电网调度、电力市场交易和电站运营管理至关重要。近年…...

武汉大学无人机视角下的多目标指代理解新基准!RefDrone:无人机场景指代表达理解数据集

作者&#xff1a;Zhichao Sun, Yepeng Liu, Huachao Zhu, Yuliang Gu, Yuda Zou, Zelong Liu, Gui-Song Xia, Bo Du, Yongchao Xu 单位&#xff1a;武汉大学计算机学院 论文标题&#xff1a;RefDrone: A Challenging Benchmark for Drone Scene Referring Expression Compreh…...

【LLM模型】如何构建自己的MCP Server?

什么是 MCP&#xff1f; Model Context Protocol (MCP) 是一种协议&#xff0c;它允许大型语言模型&#xff08;LLMs&#xff09;访问自定义的工具和服务。Trae 中的智能体作为 MCP 客户端可以选择向 MCP Server 发起请求&#xff0c;以使用它们提供的工具。你可以自行添加 MC…...

SQL 索引优化指南:原理、知识点与实践案例

SQL 索引优化指南&#xff1a;原理、知识点与实践案例 索引的基本原理 索引是数据库中用于加速数据检索的数据结构&#xff0c;类似于书籍的目录。它通过创建额外的数据结构来存储部分数据&#xff0c;使得查询可以快速定位到所需数据而不必扫描整个表。 索引的工作原理 B-…...

java基础-方法的重写、super关键字

1.定义&#xff1a;子类可以根据需要改写从父类那继承来的方法&#xff0c;执行时&#xff0c;子类的方法会覆盖父类的方法 2.要求&#xff1a; &#xff08;1&#xff09;子类和父类的方法必须同名&#xff0c;同参数列表 &#xff08;2&#xff09;父类中private修饰的方法…...

技术并不能产生一个好的产品

技术是产生一个好的产品充分条件&#xff0c;不是必要条件。 当笔者到了40岁的年龄时间&#xff0c;发现再怎么努力提升技术&#xff0c;也没办法挽救烂的产品设计。 一个好的产品&#xff0c;首先要找准自己的定位&#xff0c;不能动不动就把自己拿一线品牌来比较。 好的产品…...

lubuntu 系统详解

Lubuntu 系统详解&#xff1a;轻量高效的 Ubuntu 衍生版 一、系统概述 定位与背景&#xff1a; Lubuntu 是 Ubuntu 的官方衍生版本&#xff08;Flavor&#xff09;&#xff0c;专注于轻量性与高效性&#xff0c;旨在为低配置设备&#xff08;如老旧电脑、上网本、低配笔记本 …...

《设备管理与维修》审核严吗?“修改后再投”是拒稿了吗?

有过论文投稿经验的朋友&#xff0c;可能在审核后收到过“修改后再投”的回复。有些期刊可能是真的建议投稿人在修改后再投稿&#xff0c;有些则可能是标准的拒稿模板。 《设备管理与维修》审核严吗&#xff1f;收到“修改后再投”的回复该怎么办&#xff1f;下面我就来分享下之…...

2025年5月-信息系统项目管理师高级-软考高项一般计算题

决策树和期望货币值 加权算法 自制和外购分析 沟通渠道 三点估算PERT 当其他条件一样时&#xff0c;npv越大越好...

界面组件DevExpress WPF中文教程:Grid - 如何自定义Band Header外观?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

Supabase 的入门详细介绍

Supabase 是什么&#xff1f; 简单来说&#xff0c;Supabase 是一个开源的 Firebase 替代品。它提供了一整套后端即服务 (BaaS - Backend as a Service) 的工具&#xff0c;让你能够快速构建应用程序的后端&#xff0c;而无需自己从头搭建和管理服务器、数据库等基础设施。 S…...

【实战】基于 ABP vNext 构建高可用 S7 协议采集平台(西门子 PLC 通信全流程)

&#x1f680;&#x1f527;【实战】基于 ABP vNext 构建高可用 S7 协议采集平台&#xff08;西门子 PLC 通信全流程&#xff09;&#x1f4ca; &#x1f4d1; 目录 &#x1f680;&#x1f527;【实战】基于 ABP vNext 构建高可用 S7 协议采集平台&#xff08;西门子 PLC 通信全…...

20、map和set、unordered_map、un_ordered_set的复现

一、map 1、了解 map的使用和常考面试题等等&#xff0c;看这篇文章 map的key是有序的 &#xff0c;值不可重复 。插入使用 insert的效率更高&#xff0c;而在"更新map的键值对时&#xff0c;使用 [ ]运算符效率更高 。" 注意 map 的lower和upper那2个函数&#x…...

leetcode 189. 轮转数组

题目描述 代码&#xff1a; class Solution { public:void rotate(vector<int>& nums, int k) {int len nums.size();k k % len;reverse(nums,0,len-1);reverse(nums,0,k-1);reverse(nums,k,len-1);}void reverse(vector<int>& nums,int left,int right…...

得物0509面试手撕题目解答

题目 使用两个栈&#xff08;一个无序栈和一个空栈&#xff09;将无序栈中的元素转移到空栈&#xff0c;使其有序&#xff0c;不允许使用其他数据结构。 示例&#xff1a;输入&#xff1a;[3, 1, 6, 4, 2, 5]&#xff0c;输出&#xff1a;[6, 5, 4, 3, 2, 1] 思路与代码 如…...

8天Python从入门到精通【itheima】-6~10

目录 7节-开发出第一个Python程序&#xff1a; 1.在cmd窗口写下第一个最简单的程序&#xff1a;Hello World!!! 9节&#xff1a; 1.如何卸载python&#xff1a; 2.报错&#xff1a;不是可运行的程序 ​编辑 3.报错&#xff1a;无法初始化设备PRN&#xff1a; 4.报错&…...

Qt —— 使用Enigma Virtual Box将Qt程序打包为独立可运行exe(附:完整打包方法且完美运行)

🔔 Qt 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 打包结果 1、如下图,准备好Qt已打包后程序文件夹。附 Qt —— 在Windows下打包Qt应用程序(在其他Windows电脑下使用)...

大语言模型RLHF训练框架全景解析:OpenRLHF、verl、LLaMA-Factory与SWIFT深度对比

引言 随着大语言模型&#xff08;LLM&#xff09;参数规模突破千亿级&#xff0c;基于人类反馈的强化学习&#xff08;RLHF&#xff09;成为提升模型对齐能力的关键技术。OpenRLHF、verl、LLaMA-Factory和SWIFT作为开源社区的四大标杆框架&#xff0c;分别通过分布式架构、混合…...

VTK|类似CloudCompare的比例尺实现1-源码分析

文章目录 CloudCompare源码分析void ccGLWindowInterface::drawScale(const ccColor::Rgbub& color)&#x1f9e9; 总体功能&#x1f9e0; 函数逐步解析✅ 1. 断言只在正交模式下使用✅ 2. 计算显示的实际长度✅ 3. 字体和图形区域准备✅ 4. 计算比例尺图形的绘制位置✅ 5.…...

【计算机视觉】OpenCV实战项目:基于Tesseract与OpenCV的字符识别系统深度解析

基于Tesseract与OpenCV的字符识别系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理流水线1) 形态学操作2) 自适应阈值 2.2 Tesseract OCR引擎 3. 实战部署指南3.1 环境配置3.2 项目结构优化建议3.3 增强版代码实现 4. 常见问题与解决方案4.1 Tesseract路径错误4.2…...

CVE-2025-31258 macOS远程视图服务沙箱逃逸漏洞PoC已公开

苹果公司近日针对macOS系统中新披露的CVE-2025-31258漏洞发布补丁&#xff0c;该漏洞可能允许恶意应用程序突破沙箱限制&#xff0c;获取未授权的系统资源访问权限。在安全研究员Seo Hyun-gyu公开概念验证&#xff08;PoC&#xff09;利用代码后&#xff0c;该漏洞已在macOS Se…...

使用CAS操作实现乐观锁的完整指南

乐观锁是一种高效的并发控制机制&#xff0c;而CAS(Compare-And-Swap)是实现乐观锁的核心技术。下面我将详细介绍如何通过CAS操作实现乐观锁。 一、CAS操作原理 CAS(Compare-And-Swap)是一种原子操作&#xff0c;包含三个操作数&#xff1a; 内存位置(V)预期原值(A)新值(B) …...

java之网络编程

文章目录 网络编程概述什么是网络编程基本的通信架构CS架构BS架构 Java提供了哪些网络编程解决方案&#xff1f; 网络编程三要素IPIP地址IP域名&#xff08;Domain Name&#xff09;DNS域名解析&#xff08;Domain Name System&#xff09;公网IP、内网IP本机IPInetAddress类In…...

苍穹外卖--新增菜品

1.需求分析和设计 产品原型 业务规则&#xff1a; 菜品名称必须是唯一的 菜品必须属于某个分类下&#xff0c;不能单独存在 新增菜品时可以根据情况选择菜品的口味 每个菜品必须对应一张图片 接口设计&#xff1a; 根据类型查询分类(已完成) 文件上传 新增菜品 根据类型…...

Spark处理过程-转换算子

&#xff08;一&#xff09;RDD的处理过程 Spark使用Scala语言实现了RDD的API,程序开发者可以通过调用API对RDD进行操作处理。RDD的处理过程如图所示&#xff1b; RDD经过一系列的“转换”操作&#xff0c;每一次转换都会产生不同的RDD&#xff0c;以供给下一次“转换”操作使…...

运行Spark程序-在Spark-shell——RDD

一、基本概念 RDD&#xff08;弹性分布式数据集&#xff09;是 Apache Spark 的核心抽象&#xff0c;是 Spark 提供的最基本的数据处理单元。理解 RDD 的概念对于掌握 Spark 编程至关重要。以下是 RDD 的核心概念和特性&#xff1a; 1. 什么是 RDD&#xff1f; 定义&#xf…...

Qt应用程序启动时的一些思路:从单实例到性能优化的处理方案

程序启动时优化的价值 在桌面软件开发领域&#xff0c;应用程序的启动过程就像音乐的序曲&#xff0c;决定了用户对软件品质的第一印象。比如首次启动等待超过3秒时&#xff0c;会让大多数用户产生负面看法&#xff0c;而专业工具软件的容忍阈值甚至更低。Qt框架作为跨平台开发…...

vue3父子组件传值

父 → 子&#xff1a;props 父组件 <template><ChildComponent :message"parentMessage" :user"user" /> </template><script setup> import ChildComponent from ./ChildComponent.vue; const parentMessage Hello from paren…...

中国品牌日 | 以科技创新为引领,激光院“风采”品牌建设结硕果

品牌&#xff0c;作为企业不可或缺的隐形财富&#xff0c;在当今竞争激烈的市场环境中&#xff0c;其构建与强化已成为推动企业持续繁荣的关键基石。为了更好地保护自主研发产品&#xff0c;激光院激光公司于2020年3月7日正式注册“风采”商标&#xff0c;创建拥有自主知识产权…...