CSRF 攻击详解
什么是csrf攻击?
CSRF攻击(Cross-Site Request Forgery,跨站请求伪造)是一种常见的网络攻击方式,它利用网站对用户浏览器的信任,诱使用户在不知情的情况下发送恶意请求。这类攻击通常发生在用户已经通过身份验证的Web应用上。
工作原理
CSRF攻击的基本原理是攻击者诱使已经登录的用户(例如在银行网站上)在不知情的情况下执行攻击者预设的操作。例如,用户在没有登出银行网站的情况下,在另一个标签页中访问了攻击者的网站。攻击者的网站包含了一个请求,该请求指向银行网站并试图执行一个操作(如转账)。因为用户的浏览器仍然保持与银行网站的会话,所以这个请求会带上用户的认证cookie,使得请求看起来是合法的。
示例
假设用户登录了银行网站bank.com
,并在不退出的情况下访问了另一个包含恶意代码的网站。这个恶意网站上有如下HTML代码:
<img src="http://bank.com/transfer?amount=1000&to=attacker">
当用户浏览该页面时,他们的浏览器会尝试加载这个图片,实际上向bank.com
发起了一个转账请求。因为这个请求是从用户的浏览器发起的,所以它会自动包含用户的登录凭证(如cookie),银行网站可能会误认为这是一个合法的用户请求。
防御措施
-
使用Anti-CSRF Token:最常见的防范措施是在表单中添加一个CSRF Token,这是一个随机生成的令牌,服务器在渲染表单时生成并验证。只有包含有效CSRF Token的请求才会被接受。
-
检查Referer Header:服务器可以验证HTTP请求的Referer头部,以确保请求是从合法的源发起的。
-
使用SameSite Cookie属性:设置Cookie的SameSite属性可以限制第三方网站发送带有用户cookie的请求。例如,设置为
SameSite=Strict
将完全禁止跨站请求携带cookie。 -
提高用户安全意识:教育用户识别并避免可疑链接,保持软件更新,使用现代浏览器等,都是减少CSRF攻击风险的有效方法。
总结而言,CSRF是一种利用网站对用户浏览器的信任执行未授权操作的攻击手段。通过合理的安全策略和编程措施,可以有效地防止这种攻击。
如果浏览器端不是基于cookie,而是基于token的,还会有csrf攻击吗?
当浏览器端使用基于token的认证方式(如在HTTP头中使用Bearer token)而非依赖于自动由浏览器附加的cookies时,跨站请求伪造(CSRF)攻击的风险会显著降低。这是因为CSRF攻击的核心在于利用了浏览器自动发送cookie的行为。如果认证信息(如token)需要明确地由前端代码设置在HTTP请求的头部,那么恶意网站则无法自动复制这种行为,因为浏览器的同源策略(SOP)阻止了一个源读取另一个源的数据。
(当用户停留在当前网站的页面,这意味着session还没结束,然后又打开了另一个tab网页,这个网页里内嵌了第一部分加载 img 的代码,浏览器试图解析这个 "img" ,去访问了银行的这个链接,这时候浏览器是自动把 cookie 带上访问的,不需要开发者处理;
但是基于token的访问就需要前端开发人员手动把 token 放在 header 里,所以就避免了csrf攻击
这也解释了为什么csrf 攻击只存在于浏览器端)
为什么基于Token的认证较不易受CSRF攻击:
-
不自动附加:与cookie不同,存储在本地存储(localStorage或sessionStorage)的token不会自动附加到每个发往服务器的请求中。开发者需要显式地将token添加到请求的Authorization头部。这意味着只有能够通过JavaScript访问token的网站才能发起带有认证信息的请求。
-
受同源策略保护:浏览器的同源策略阻止了一个源的脚本访问另一个源的数据。因此,如果token存储在例如localStorage中,恶意网站的脚本无法从另一个标签页的localStorage中读取token,除非两个标签页都来自相同的源。
仍需注意的安全问题:
尽管基于token的认证机制在防御CSRF方面较为安全,但它并不是没有安全隐患,例如:
-
跨站脚本攻击(XSS):如果恶意脚本能够注入并执行在一个网站上,那么它可能能够访问localStorage或sessionStorage,并窃取存储的token。因此,防御XSS攻击对于使用token仍然非常重要。
-
其他类型的攻击:虽然基于token的认证减少了CSRF的风险,但仍需防范其他类型的攻击,如钓鱼攻击、中间人攻击等。
最佳实践:
- 使用HTTPS:确保所有通信都通过安全的HTTP(HTTPS)进行,以避免中间人攻击。
- 有效的内容安全策略(CSP):实施CSP帮助减少XSS的风险。
- 定期更新和旋转token:确保token具有过期时间,并在必要时进行更换,以减少被窃用的风险。
- 验证请求的来源:尽管不是必要的,但检查请求的来源(如检查HTTP头中的Origin或Referer)可以增加一个额外的安全层。
总结来说,基于token的认证方式确实减少了CSRF攻击的风险,但仍需要结合其他安全措施,来保护应用免受各种网络攻击的威胁。
https会对整个request报文加密吗,还是只对请求的payload加密?
在HTTPS(HTTP Secure)协议下,不仅请求的payload(即HTTP请求的主体内容)被加密,而且整个HTTP请求和响应的头部信息(headers)也被加密。这意味着除了基本的TCP/IP层(例如IP地址和端口号)信息外,发送到服务器的所有信息,包括URL的路径(但不包括域名部分,如下所述)、查询参数、cookies、用户代理等,都被加密。HTTPS通过SSL/TLS协议实现加密,保护数据免受中间人攻击的窥探和篡改。
HTTPS的加密范围
以下是HTTPS加密的具体内容:
-
请求和响应头部:所有的HTTP头部都被加密,包括用户代理、cookie、认证信息、自定义头部等。
-
请求和响应主体:任何发送给服务器的数据或从服务器接收的数据,无论是文本、图片、视频还是其他任何类型的数据,都会被加密。
-
URL的路径和查询字符串:虽然整个URL不在HTTP请求行中传输(因为HTTP请求只包含路径和查询部分,而不包括协议和域名),但路径和查询字符串部分仍然会被加密。
HTTPS不加密的部分
- 域名:虽然域名本身不在HTTP请求中发送,但通过DNS解析过程可能会暴露,并且在SSL/TLS握手过程中,服务器域名(通过服务器证书呈现)是可见的。此外,使用Server Name Indication(SNI)扩展的SSL/TLS握手会在握手过程中明文传输域名,尽管新的加密SNI(ESNI)技术正在逐步推广以解决这一问题。
安全性和隐私
由于HTTPS加密了除DNS查找和SNI字段外的所有HTTP交互数据,它有效地保护了用户数据的机密性和完整性,防止了数据在传输过程中被窥视或篡改。这对于保护敏感操作,如在线购物、银行交易和个人数据传输等,尤为重要。
结论
总之,HTTPS确保除了域名和部分握手细节外,整个HTTP请求和响应过程中传输的数据都得到了加密和保护。这包括HTTP头部和主体数据,使得HTTPS非常适合保护用户在互联网上的隐私和安全。
为什么csrf攻击只存在于浏览器端?
CSRF(跨站请求伪造)攻击主要存在于浏览器端,原因在于浏览器的特性和行为。以下是详细的解释:
1. 浏览器自动发送认证信息
CSRF 攻击利用了浏览器的一个特性:浏览器会自动发送存储在它内部的认证信息(如 Cookies、HTTP 认证头等)。当用户登录一个网站后,浏览器会把该网站的会话 Cookie 保存在客户端。在用户访问相同网站的其他页面或者发送请求时,浏览器会自动附带这些 Cookies。
2. CSRF 攻击的基本流程
一个典型的 CSRF 攻击流程如下:
- 用户登录到受信任的网站(如银行网站),并保持登录状态。
- 用户在浏览器中打开一个恶意网站,该网站包含一个恶意脚本或链接,触发对受信任网站的请求。
- 浏览器自动附带用户的会话 Cookie 发送这个请求到受信任的网站。
- 受信任的网站接收到请求后,由于会话 Cookie 有效,认为这是一个合法的请求并执行相应操作。
3. 非浏览器客户端的行为
与浏览器不同,非浏览器客户端(如移动应用、桌面应用、API 客户端)不会自动附带认证信息(如 Cookies)发送请求。通常,这些客户端需要明确地设置认证信息,例如在 HTTP 请求头中添加授权令牌(如 JWT)。因此,攻击者无法轻易伪造请求并附带合法的认证信息进行操作。
4. 示例解释
假设你有一个银行网站 https://bank.com
,用户在浏览器中登录了这个网站,并且浏览器保存了一个会话 Cookie。
在浏览器中:
- 用户登录
https://bank.com
,浏览器保存会话 Cookie。 - 用户访问恶意网站
https://malicious.com
,该网站包含以下代码:html
复制<img src="https://bank.com/transfer?amount=1000&to=attackerAccount" />
- 浏览器自动发送请求到
https://bank.com
,并附带会话 Cookie。 - 银行网站接收到请求并执行转账操作。
在非浏览器客户端中:
假设你有一个移动应用,需要访问银行 API https://api.bank.com/transfer
。
- 移动应用发送请求时,必须明确地在请求头中设置认证信息(如 JWT)。
java
复制HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://api.bank.com/transfer")).header("Authorization", "Bearer <token>").build();
- 恶意应用无法自动附带合法的认证信息,除非它已经获取了用户的认证信息(如盗取了 JWT),但这属于另一种类型的攻击(如盗取令牌)。
5. 防御措施
虽然 CSRF 主要针对浏览器,但理解它的工作原理有助于更好地防御类似的攻击。常见的防御措施包括:
- CSRF 令牌:在每个敏感请求中包含一个唯一的、不可预测的令牌,并在服务器端验证该令牌。
- SameSite Cookie 属性:设置 Cookie 的
SameSite
属性为Strict
或Lax
,限制 Cookie 的跨站发送。 - 检测 Referer 头:部分系统会检查请求的
Referer
头,以确保请求来源于同一站点。
结论
CSRF 攻击依赖于浏览器自动附带认证信息的特性,因此在浏览器环境中更容易实现和利用。在非浏览器客户端中,由于认证信息需要明确设置,CSRF 攻击的风险大大降低。了解这些原理可以帮助开发者更好地保护应用免受 CSRF 攻击。
为什么在springsecurity里一般都disable掉csrf?
在 Spring Security 中,CSRF(跨站请求伪造)保护是默认启用的,因为它是防止用户在已经认证的状态下被恶意网站利用的一个重要安全机制。然而,在某些情况下,开发者会选择禁用 CSRF 保护。以下是一些常见的原因和场景:
1. API 端点
在开发 RESTful API 时,通常不需要 CSRF 保护,因为:
- RESTful API 通常是无状态的,并且客户端(如移动应用、单页应用)不会存储和使用会话 Cookie。
- API 请求通常使用 JWT(JSON Web Token)或其他基于令牌的认证机制,而不是基于会话的认证。
java
复制
@Override
protected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().anyRequest().authenticated();
}
2. 使用其他防护措施
有时,应用程序可能已经使用了其他防护措施,如 JWT 或 OAuth,这些机制在某种程度上也可以防御 CSRF 攻击。例如,通过在请求头中发送令牌,攻击者难以伪造合法的请求。
3. 内部应用
对于一些内部应用,特别是完全在受控环境中运行的应用,开发者可能会认为 CSRF 风险较低,因此选择禁用它。
4. 非浏览器客户端
如果应用的客户端不是浏览器,如移动应用、桌面应用或其他类型的客户端,这些客户端不会遭受传统的 CSRF 攻击。因此,可以选择禁用 CSRF 保护。
5. 简化开发和测试
在开发和测试阶段,有时为了简化工作流程,开发者会暂时禁用 CSRF 保护。但在这种情况下,应该确保在生产环境中重新启用 CSRF 保护。
例外情况
尽管有以上原因,有些情况下不应该禁用 CSRF 保护,特别是在以下场景中:
- Web 应用程序接受来自用户的表单提交。
- 应用程序依赖于会话来管理用户认证状态。
如何禁用 CSRF
如果你确实需要禁用 CSRF 保护,可以在 Spring Security 配置中通过 HttpSecurity
的 csrf().disable()
方法来实现:
java
复制
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().anyRequest().authenticated();}
}
总结
禁用 CSRF 保护有其合理的应用场景,特别是在开发 RESTful API、使用其他防护措施、内部应用和非浏览器客户端时。然而,需要谨慎对待这个决定,并确保在适当的场景中启用 CSRF 保护,以防范潜在的安全风险。
如果springsecurity不禁用csrf会怎么样?
在 Spring Security 中,如果不禁用 CSRF 保护,应用程序会具有一定的安全保障,防止跨站请求伪造攻击。具体来说,不禁用 CSRF 保护会带来以下影响和行为:
1. 表单提交需要 CSRF 令牌
当 CSRF 保护启用时,所有通过表单提交的 POST、PUT、DELETE 等敏感请求都需要包含一个有效的 CSRF 令牌。这个令牌由服务器生成,并在表单中以隐藏字段的形式包含。服务器会验证令牌的有效性,以确保请求来自合法用户。
示例:
html
复制
<form action="/some-action" method="POST"><input type="hidden" name="_csrf" value="generated-csrf-token" /><!-- 其他表单字段 --><button type="submit">Submit</button>
</form>
在 Spring MVC 控制器中可以这样生成 CSRF 令牌:
java
复制
@GetMapping("/form")
public String showForm(Model model) {model.addAttribute("csrfToken", ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getAttribute("_csrf"));return "form";
}
2. AJAX 请求需要 CSRF 令牌
对于使用 AJAX 发送的请求,CSRF 令牌需要在请求头中包含。通常情况下,可以在全局 AJAX 设置中配置 CSRF 令牌:
javascript
复制
$.ajaxSetup({beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));}
});
3. 错误处理
如果请求不包含有效的 CSRF 令牌,服务器会返回 403 Forbidden 错误,表示请求被拒绝。这可以防止未经授权的请求执行敏感操作。
4. RESTful API 的影响
在 RESTful API 中,如果启用了 CSRF 保护,客户端需要在每个非 GET 请求中包含 CSRF 令牌。这在使用基于令牌的认证机制(如 JWT)时会显得多余,因为这些机制已经提供了一定的安全保障。在这种情况下,通常会禁用 CSRF 保护:
java
复制
@Override
protected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().anyRequest().authenticated();
}
5. 安全性提升
启用 CSRF 保护后,应用程序可以有效防止 CSRF 攻击。这种攻击利用用户的身份执行未经授权的操作,可能导致数据泄露、账户操作等安全问题。
总结
如果在 Spring Security 中不禁用 CSRF 保护,应用程序会有以下行为和影响:
- 表单提交和 AJAX 请求需要包含有效的 CSRF 令牌。
- 服务器会验证 CSRF 令牌的有效性,拒绝未包含或包含无效令牌的请求。
- RESTful API 可能需要额外的配置来处理 CSRF 令牌,或选择禁用 CSRF 保护。
- 提升整体安全性,有效防止 CSRF 攻击。
启用 CSRF 保护有助于增强应用的安全性,但需要开发者在前端和后端之间进行适当的协调,确保所有敏感请求都包含有效的 CSRF 令牌。
相关文章:
CSRF 攻击详解
什么是csrf攻击? CSRF攻击(Cross-Site Request Forgery,跨站请求伪造)是一种常见的网络攻击方式,它利用网站对用户浏览器的信任,诱使用户在不知情的情况下发送恶意请求。这类攻击通常发生在用户已经通过身…...

单链表OJ题(课堂总结)
1.链表的带环问题 上图就是一个典型的带环链表 1.1如何判读链表是否带环? 最常见的方法就是利用快慢指针,快指针追加慢指针,当二者相等的时候即可判断链表带环 其实现的代码如下: bool hasCycle(struct ListNode*head) { s…...

cad角度如何精确到0.1
可以通过更改角度精度的方式把角度的标注精确到小数点后几位,具体方法如下: 1、打开一个CAD文档,在文档中画一个角,如下图: 文章源自设计学徒自学网-https://www.sx1c.com/47920.html 2、给此角进行角度的标注&#…...

STM32H743+USBHID+CubeMX配置
一、环境准备 电脑系统:Windows 10 专业版 20H2 IDE:Keil v5.35、STM32CubeMX v6.5.0 测试硬件:正点原子阿波罗STM32H743 二、测试步骤 1、使用用例工程 配置STM32H743定时器功能-CSDN博客https://blog.csdn.net/horse_2007s/article/d…...
路由传参和获取参数的三种方式
路由传参和获取参数在前端开发中是一个常见的需求,特别是在使用如 Vue.js、React 等前端框架时。下面,我将以 Vue.js 为例,介绍三种常见的路由传参和获取参数的方式: 1. 使用 params 传参 传参: 在路由配置中&#…...
代码随想录算法训练营第四十一天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
代码随想录算法训练营第四十一天 509. 斐波那契数 题目链接:509. 斐波那契数 动规五部曲: 确定dp数组以及下标的含义:第i个数的斐波那契数值是dp[i]确定递推公式:dp[i] dp[i - 1] dp[i - 2];dp数组如何初始化:dp[…...
HTML5表单控件:新时代的交互魔法手册
🚀HTML5表单控件:新时代的交互魔法手册 🎯HTML5表单控件速览:新面孔,新功能1. 日期时间选择器(Date & Time Picker)2. 数字输入框(Number Input)3. 搜索框࿰…...

WordPress安装插件失败No working transports found
1. 背景(Situation) WordPress 社区有非常多的主题和插件,大部分人用 WordPress 都是为了这些免费好用的主题和插件。但是今天安装完 WordPress 后安装插件时出现了错误提示:“ 安装失败:下载失败。 No working trans…...
多线程理论及操作
【一】什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程 一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合到一起ÿ…...

本周 MoonBit 核心库进行 API 整理工作、工具链持续完善
MoonBit更新 【核心库 Breaking】核心库进行API整理工作 所有immutable数据结构被放在immut路径下,如immutable_hashmap.Map变为immut/hashmap.Map // Before let a : immutable_hashmap.Map[Int, Int] immutable_hashmap.make() // After let a : immut/hashma…...

Golang net/http标准库常用方法(三)
大家好,针对Go语言 net/http 标准库,将梳理的相关知识点分享给大家~~ 围绕 net/http 标准库相关知识点还有许多章节,请大家多多关注。 文章中代码案例只有关键片段,完整代码请查看github仓库:https://github.com/hltfa…...
24校招总结
个人背景 本科:三本通信专业 硕士:B区双非计算机硕 今年2月签了东南沿海二线城市某公司C游戏服务端开发 我同学大部分都是去电网,大专老师,气象局事业编……就我这个是纯牛马了。 离收到Offer3个月了,前段时间参加…...
PHP APCu缓存使用与避坑
APCu 极简概括: PHP 的开源内存缓存扩展,类比Redis,但是一般都用Redis,所以APCu用的很少。官方文档:https://www.php.net/manual/zh/apcu.configuration.php解决问题:类比Redis做缓存组件,提升…...
mybatis xml
delete from t_enterprise_output_value where output_id IN #{outputId} 批量插入 功能:单个或批量插入数据,若数据已存在,则忽略 <insert id"saveBatchIgnoreInto" parameterType"java.util.List">insert igno…...

“不是我兄弟”!刘强东内部“狼性训话”流出!
今天,京东创始人刘强东5月24日的线上讲话流出。 在这次线上讲话中,刘强东首先宣布为全体采销员工涨薪20%—100%,随后进行了一番“狼性训话”。往期报道可戳:刘强东怒了:“不是我兄弟”! 刘强东在讲话中指…...

函数调用时长的关键点:揭秘参数位置的秘密
新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、默认参数的秘密 示例代码 二、关键字参数与位置参数的舞蹈 示例代码 总结 一、默认参…...

【数据分析面试】54.员工信息(HR)数据库搭建
题目 由于发展需求,进一步提高公司人员统筹管理的能力,公司决定要重新升级人力数据管理系统。 现在,你的任务是为公司重新设计和搭建一个员工信息数据库。 提示:考虑HR管理系统的功能,比如人员信息、入职时间、离职…...
通过JavaScript本地存储数据
文章目录 本地存储本地存储分类 - localStorage本地存储分类 - sessionStorage存储复杂数据类型解决方法 本地存储 数据存储在用户浏览器中设置、读取方便、甚至页面刷新都不丢失数据容量较大,sessionStorage和localStorage约5M左右 本地存储分类 - localStorage …...
CTF-web-攻防世界-3
1、inget (1)、进入网站,提示传入id值 (2)、用一些闭合方式,返回都一样。 (3)、尝试万能密码。获得flag 2、mfw (1)、页面没有什么特殊的异常,使用dirsearch进行目录扫描,有一些.git文件。看样子是.git文件泄露。 使用githa…...
【附代码案例】深入理解 PyTorch 张量:叶子张量与非叶子张量
在 PyTorch 中,张量是构建神经网络模型的基本元素。了解张量的属性和行为对于深入理解模型的运行机制至关重要。本文将介绍 PyTorch 中的两种重要张量类型:叶子张量和非叶子张量,并探讨它们在反向传播过程中的行为差异。 叶子张量与非叶子张…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...
标注工具核心架构分析——主窗口的图像显示
🏗️ 标注工具核心架构分析 📋 系统概述 主要有两个核心类,采用经典的 Scene-View 架构模式: 🎯 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 🔧 关键函数&…...
基于Java项目的Karate API测试
Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...