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

网络安全 | Web安全常见漏洞和防护经验策略

关注:CodingTechWork

引言

  OWASP (Open Web Application Security Project) Top 10是Web应用最常见的安全风险集合,帮助开发人员和安全专家识别和防止最严重的网络安全问题。以下是基于OWASP Top 10的Web安全防护经验策略与规则集。Web开发者必须对潜在的安全风险有足够的认识,以便保护用户数据、系统和服务。本文将详细介绍Web应用中的Top 10常见的一些漏洞,包括漏洞的描述、原理和防护策略,并通过Java代码示例加以展示。

SQL注入 (SQL Injection)

漏洞描述:

SQL注入是一种通过将恶意的SQL代码插入Web应用的输入字段,从而操控后端数据库的攻击手段。攻击者可以通过SQL注入来获取敏感信息、删除数据甚至控制整个数据库。

漏洞原理:

SQL注入攻击利用了开发人员在构建SQL查询时没有对用户输入进行充分验证和转义。攻击者通过构造恶意输入,修改SQL查询的逻辑,从而执行未授权的操作。

漏洞分析:

SQL注入通常通过操控Web应用程序与数据库交互的SQL查询来实现。攻击者可以通过在输入字段中插入SQL代码,操控查询逻辑,从而读取、修改、删除数据库中的数据,甚至执行管理员权限的操作。常见的攻击方式包括:

  • 经典注入:在输入字段中注入SQL命令。例如:' OR 1=1 --admin' --
  • 盲注:攻击者不直接看到查询结果,但可以通过反复提交数据,观察应用响应的变化来推断数据库内容。例如:' AND 1=1 --' AND 1=2 --
  • 时间盲注:通过延迟响应来判断SQL查询的结果。例如:' AND SLEEP(5) --

防护策略:

  • 使用参数化查询(Prepared Statements):这种方式通过将输入作为参数传递给查询,而不是直接拼接SQL语句,从而避免了SQL注入。
  • 输入验证与过滤:对用户输入的数据进行严格的验证和过滤,拒绝任何不符合预期的输入。可以过滤掉像'、--、;等特殊字符,并根据输入内容验证其合理性(如邮箱、电话号码、日期格式等)。
  • 最小权限原则:确保数据库用户只具有执行所需操作的最小权限。即使攻击者能够注入SQL,也能减少破坏的范围。
  • 错误信息处理:不暴露数据库错误信息。避免显示详细的SQL错误,防止攻击者通过错误信息推断数据库结构和逻辑。

示例(有漏洞):

String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);

攻击者输入:

username: admin
password: ' OR 1=1 -- 

防护代码:

// 定义 SQL 查询语句,使用问号 (?) 作为参数的占位符
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();

跨站脚本攻击 (XSS - Cross-Site Scripting)

漏洞描述:

XSS攻击是指攻击者将恶意的脚本代码注入到网页中,当其他用户加载该网页时,这段脚本会在其浏览器中执行,可能导致数据泄露、会话劫持、钓鱼攻击等。

漏洞原理:

XSS攻击的核心是通过注入恶意脚本代码,使得该脚本在其他用户的浏览器中执行。这通常是由于Web应用未对用户输入进行充分的输出编码(如HTML、JavaScript编码)。

漏洞分析:

XSS攻击通过将恶意JavaScript脚本插入Web页面来执行,攻击者可以借此窃取用户信息、劫持用户会话或注入恶意操作。XSS通常有三种类型:

  • 反射型XSS:攻击者将恶意脚本代码嵌入请求参数中,服务器返回该参数时直接执行。
  • 存储型XSS:恶意脚本被存储在服务器端(例如评论、留言板),当其他用户加载该页面时执行。
  • DOM型XSS:攻击者通过修改页面的DOM元素,使得客户端脚本在用户浏览器中执行。

防护策略:

  • 对输出内容进行HTML转义:对用户输入的内容进行HTML编码,防止恶意脚本执行。
  • 使用Content Security Policy (CSP):通过设置CSP,可以限制哪些脚本能够被执行,从而防止注入脚本的执行。
  • HTTPOnly 和 Secure Cookie:使用 HttpOnly 属性的Cookie可以防止JavaScript访问Cookie,减少会话劫持的风险。使用 Secure 属性确保Cookie只通过HTTPS传输。
  • 输入验证与清理:不仅要对输出进行编码,也要在输入阶段验证数据的合法性,避免非法字符和脚本注入。
  • 使用库和框架的安全特性:现代Web框架(如Spring、Django等)通常会提供内建的防XSS功能,比如自动转义HTML输出。
  • 最小化JavaScript代码的使用:避免直接在HTML中嵌入JavaScript代码,尤其是从不可信来源获取的脚本。尽量使用外部脚本并通过CSP控制其来源。

示例(反射型XSS):

String search = request.getParameter("search");
out.println("<input type='text' name='search' value='" + search + "'>");

攻击者输入:

<script>alert('XSS');</script>

防护代码:

String search = request.getParameter("search");
// 使用 Apache Commons Text 库对 "search" 参数进行 HTML 转义,防止 XSS 攻击
String safeSearch = org.apache.commons.text.StringEscapeUtils.escapeHtml4(search);
out.println("<input type='text' name='search' value='" + safeSearch + "'>");

跨站请求伪造 (CSRF - Cross-Site Request Forgery)

漏洞描述:

CSRF攻击迫使用户执行未授权的操作,利用的是用户在浏览器中的有效身份信息。攻击者通过伪造请求,诱使用户在不知情的情况下操作Web应用,如修改账户信息、转账等。

漏洞原理:

CSRF攻击依赖于Web应用未验证请求来源是否合法,导致用户在登录状态下执行恶意操作。

漏洞分析:

  • 用户身份利用:攻击者会伪造一个请求,诱导用户在已登录的状态下访问该请求。由于用户在目标网站上已经登录,浏览器会自动携带有效的身份认证信息(如cookie),导致恶意请求以合法用户的身份被执行。
  • 诱骗用户操作:攻击者可以通过诱导用户点击链接、加载图片或提交表单等方式,让浏览器发起跨站请求,如修改账户信息、转账资金等。
  • 攻击目标:例如,攻击者可以通过伪造转账请求,从受害者的银行账户转账到攻击者账户。

防护策略:

  • 使用CSRF令牌:在用户请求中加入一个唯一的令牌,确保每次请求都是合法用户发起的。
  • 验证请求的来源:检查HTTP请求头中的Referer和Origin字段,确保请求来自合法站点。
  • 双重提交cookie:除了验证请求中的令牌外,还可以通过将CSRF令牌存储在cookie中并与请求中的token比对来增强防护。

示例(没有防护):

<form action="http://example.com/transfer" method="POST"><input type="hidden" name="amount" value="1000"><input type="hidden" name="to_account" value="attacker_account"><input type="submit" value="Transfer">
</form>

防护代码:

<form action="http://example.com/transfer" method="POST"><!-- 隐藏的 CSRF token,用于防止跨站请求伪造攻击 --><input type="hidden" name="csrf_token" value="${csrfToken}"><input type="hidden" name="amount" value="1000"><input type="hidden" name="to_account" value="attacker_account"><input type="submit" value="Transfer">
</form>

生成和验证CSRF令牌:

// 生成CSRF Token
String csrfToken = UUID.randomUUID().toString();
session.setAttribute("csrfToken", csrfToken);// 验证CSRF Token
String csrfTokenFromRequest = request.getParameter("csrf_token");
if (!csrfTokenFromRequest.equals(session.getAttribute("csrfToken"))) {throw new ServletException("Invalid CSRF token.");
}

安全配置错误 (Security Misconfiguration)

漏洞描述:

安全配置错误指的是Web应用、数据库、服务器等的配置不当,可能导致攻击者获取敏感信息或访问不该访问的资源。

漏洞原理:

攻击者利用配置错误(如暴露敏感信息、默认用户名和密码等)来获取系统的敏感数据或执行未授权操作。

漏洞分析:

  • 暴露敏感信息:攻击者利用默认配置或错误配置,访问到不该公开的系统信息或敏感数据。例如,错误配置的服务器可能会暴露敏感信息(如数据库用户名、密码等),或者Web应用可能会泄露调试信息。
  • 错误的权限设置:可能存在权限过于宽松或没有进行恰当的资源保护。例如,服务器可能没有配置适当的访问控制策略,导致未授权用户能够访问管理员页面或敏感数据。
  • 错误的目录配置:服务器文件和目录结构可能会暴露给外部访问,攻击者可以利用这些信息来进一步探索系统漏洞。

防护策略:

  • 禁用不必要的服务:关闭不必要的端口、服务和功能,减少攻击面。
  • 隐藏服务器信息:通过配置Web服务器来隐藏或限制暴露的服务器版本信息。
  • 使用最小权限原则:系统资源、数据库、文件和目录的权限设置应遵循最小权限原则,确保只授予必要的访问权限。

示例:(暴露敏感信息)

// 如果不小心在日志中输出敏感信息
System.out.println("Server: Apache/2.4.41");

防护代码:

禁用或隐藏服务器版本信息:

// 在web.xml配置中隐藏服务器信息
<security-constraint><web-resource-collection><url-pattern>/</url-pattern></web-resource-collection><auth-constraint><role-name>admin</role-name></auth-constraint>
</security-constraint>

使用有漏洞的组件 (Using Components with Known Vulnerabilities)

漏洞描述:

使用第三方组件或库时,如果这些组件存在已知的漏洞,攻击者就可以通过利用这些漏洞进行攻击。

漏洞原理:

攻击者通过利用第三方库中已知的漏洞进行攻击,例如远程代码执行、SQL注入等。

漏洞分析:

  • 已知漏洞:攻击者通过利用Web应用中使用的已知存在漏洞的第三方组件(如过时的库和框架)来发起攻击。例如,攻击者可以利用旧版本的log4j漏洞执行远程代码或获取敏感信息。
  • 供应链攻击:攻击者通过注入恶意代码到不再维护的开源组件中,从而在应用中施行攻击。
  • 版本回退攻击:如果Web应用使用了过时且未更新的版本,攻击者可以利用这些漏洞获取服务器的控制权,或利用未修补的漏洞执行恶意操作。

防护策略:

  • 定期更新组件:确保使用的库和框架都已经更新到没有已知漏洞的版本。
  • 使用安全版本的组件:从官方源获取库,避免使用不安全的第三方库。
  • 组件管理工具:利用自动化工具(如OWASP Dependency-Check)来检测和报告依赖组件中已知的漏洞。

示例:

假设应用程序使用了一个带有已知漏洞的旧版本log4j,攻击者可能通过远程代码执行漏洞攻击服务器。

<!-- 使用带有漏洞的旧版log4j -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.0</version> <!-- 使用已知存在漏洞的旧版本 -->
</dependency>

防护策略:

<!-- 在pom.xml中指定更新的log4j版本 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.17.1</version> <!-- 使用最新的安全版本 -->
</dependency>

不安全的反序列化 (Insecure Deserialization)

漏洞描述:

不安全的反序列化是指在Web应用中接收外部用户数据并进行反序列化时,攻击者可以通过传递恶意的序列化数据,造成远程代码执行或权限提升。

漏洞原理:

攻击者构造恶意的序列化对象,利用不安全的反序列化过程执行恶意代码。

漏洞分析:

  • 远程代码执行 (RCE):攻击者可以通过构造恶意的序列化数据,利用反序列化过程执行恶意代码。此攻击通常利用了类的特殊方法(如readObject())来执行代码。通过发送恶意的序列化数据,攻击者可能在目标系统上执行任意命令,甚至远程获取访问权限。
  • 权限提升:通过不安全的反序列化,攻击者可能能够改变程序内部的对象状态,进而提升权限或绕过某些安全检查。
  • 拒绝服务 (DoS):恶意对象可能在反序列化时消耗大量资源,导致服务器崩溃或无法响应。

防护策略:

  • 避免反序列化来自不可信来源的数据:不要直接反序列化不信任的数据。
  • 进行严格的类过滤:在反序列化时,检查并限制允许的类。
  • 使用签名和校验:对传输的数据进行加密或签名,确保数据未被篡改。
  • 使用更安全的替代方案:如果可能,使用JSON、XML等更加安全的序列化格式,避免Java原生的序列化机制。

示例:

恶意的反序列化数据:

// 假设恶意对象
class MaliciousObject implements Serializable {private void readObject(ObjectInputStream ois) throws IOException {Runtime.getRuntime().exec("rm -rf /");}
}ObjectInputStream ois = new ObjectInputStream(inputStream);
MaliciousObject obj = (MaliciousObject) ois.readObject();

防护代码:
使用ObjectInputStreamresolveClass方法来限制反序列化的类:

ObjectInputStream ois = new ObjectInputStream(inputStream) {@Overrideprotected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {if (!desc.getName().equals("com.example.MaliciousObject")) {return super.resolveClass(desc);}throw new ClassNotFoundException("Unauthorized class");}
};
MaliciousObject obj = (MaliciousObject) ois.readObject();

敏感数据泄露 (Sensitive Data Exposure)

漏洞描述:

敏感数据泄露指的是应用程序未能有效地保护用户的敏感信息,如密码、银行卡信息等,导致信息泄露。

漏洞原理:

应用程序未对存储或传输中的敏感数据进行加密,攻击者可以通过未加密的传输方式或不安全的存储介质获取敏感信息。

漏洞分析:

  • 中间人攻击 (MITM):攻击者通过截获未加密的通信流量,获取敏感信息,如密码、银行卡号等。
  • 数据库泄露:如果敏感数据以明文形式存储,攻击者可以直接访问数据库或从备份中获取敏感信息。
  • 应用程序漏洞:攻击者可以通过SQL注入、XSS等漏洞窃取敏感信息。

防护策略:

  • 加密存储敏感数据:使用强加密算法(如AES)对敏感信息进行加密存储。
  • 加密传输敏感数据:使用SSL/TLS确保数据传输时的安全性。
  • 最小化敏感数据存储:避免存储不必要的敏感数据,尽量将敏感信息存储在更安全的环境中,如硬件安全模块(HSM)或加密数据库。

示例:

明文密码存储:

String password = "123456";

防护代码:使用强加密存储密码:

import org.mindrot.jbcrypt.BCrypt;
// 存储hashedPassword,而非明文密码
String hashedPassword = BCrypt.hashpw("123456", BCrypt.gensalt());

访问控制漏洞 (Broken Access Control)

漏洞描述:

访问控制漏洞允许攻击者绕过权限检查,访问不应访问的资源。

漏洞原理:

攻击者通过修改请求中的参数、URL等方式绕过访问控制策略,访问受限资源。

漏洞分析:

  • 横向权限提升:攻击者通过修改请求中的参数(如userId),访问本不属于自己的资源。常见的攻击方式是通过URL路径或HTTP请求的参数来篡改访问目标。
  • 纵向权限提升:攻击者通过漏洞获取或猜测管理员、超级用户的权限,从而执行高危操作,如删除数据或更改权限。
  • ID猜测攻击:如果用户ID等标识符是可猜测的,攻击者可以通过暴力破解或猜测ID,访问其他用户的数据。

防护策略:

  • 基于角色的访问控制 (RBAC):使用严格的角色管理,确保用户只能访问与其角色相关的资源。
  • 细粒度权限控制:实施最小权限原则,确保每个用户只具有其完成工作所需的最小权限。
  • 访问控制策略:在服务端实现权限检查,避免依赖客户端的控制,确保每次请求都经过有效的权限验证。
  • 防止ID猜测:使用难以预测的ID(如UUID)来避免攻击者通过暴力破解猜测资源标识符。

示例:

攻击者通过修改URL参数访问受限资源:

// 获取 URL 参数中的 userId
String userId = request.getParameter("userId");// 查询数据库,获取对应的用户信息
User user = userService.getUserById(userId);// 展示用户信息
response.getWriter().println(user);

防护代码:

// 获取 URL 参数中的 userId
String userId = request.getParameter("userId");// 从会话中获取当前登录用户的 ID
String currentUserId = (String) session.getAttribute("userId");// 检查请求的 userId 是否与当前登录用户的 ID 匹配
if (userId != null && userId.equals(currentUserId)) {// 查询数据库,获取当前用户的个人信息User user = userService.getUserById(userId);// 展示用户信息response.getWriter().println(user);
} else {// 如果 userId 不匹配,返回拒绝访问错误response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
}

监控与日志记录不足 (Insufficient Logging & Monitoring)

漏洞描述:

缺乏有效的日志记录和监控使得恶意行为无法被及时检测和响应,导致潜在的攻击得不到有效的应对。

漏洞原理:

如果应用程序没有记录足够的日志,攻击者可能在系统中活动较长时间而不被发现,增加了数据泄露和权限提升的风险。

漏洞分析:

  • 绕过检测:攻击者在没有足够日志记录的情况下,可以长时间从事恶意活动而不被察觉。通过反复尝试弱密码、利用漏洞等手段,可能在没有警报的情况下成功入侵。
  • 持久化攻击:如果没有有效的监控和日志,攻击者可能会在系统中保持长期的隐藏状态,安装后门,或实施持久性攻击而不被及时发现。
  • 清除日志:攻击者可能会试图删除或篡改日志,以隐藏他们的活动轨迹,导致管理员无法追踪攻击过程。

防护策略:

  • 详细的日志记录:记录所有关键操作,如登录、资源访问、错误信息、权限更改等。
  • 定期监控日志:定期审计和分析日志,发现潜在的异常行为和攻击活动。可以使用自动化工具来帮助检测异常模式。
  • 防篡改日志:确保日志文件的完整性,采用数字签名或其他手段防止日志被篡改。
  • 设置警报机制:根据日志分析设定异常行为触发的警报,并在异常发生时及时响应。

示例:

System.out.println("User logged in from IP: " + request.getRemoteAddr());

防护代码:
使用Java日志库(如Log4j)记录详细信息:

import org.apache.log4j.Logger;Logger logger = Logger.getLogger(MyClass.class);
logger.info("User logged in from IP: " + request.getRemoteAddr());

相关文章:

网络安全 | Web安全常见漏洞和防护经验策略

关注&#xff1a;CodingTechWork 引言 OWASP (Open Web Application Security Project) Top 10是Web应用最常见的安全风险集合&#xff0c;帮助开发人员和安全专家识别和防止最严重的网络安全问题。以下是基于OWASP Top 10的Web安全防护经验策略与规则集。Web开发者必须对潜在…...

Unity 3D游戏开发从入门进阶到高级

本文精心整理了Unity3D游戏开发相关的学习资料&#xff0c;涵盖入门、进阶、性能优化、面试和书籍等多个维度&#xff0c;旨在为Unity开发者提供全方位、高含金量的学习指南.欢迎收藏。 学习社区 Unity3D开发者 这是一个专注于Unity引擎的开发者社区&#xff0c;汇聚了众多Un…...

浅谈云计算14 | 云存储技术

云存储技术 一、云计算网络存储技术基础1.1 网络存储的基本概念1.2云存储系统结构模型1.1.1 存储层1.1.2 基础管理层1.1.3 应用接口层1.1.4 访问层 1.2 网络存储技术分类 二、云计算网络存储技术特点2.1 超大规模与高可扩展性2.1.1 存储规模优势2.1.2 动态扩展机制 2.2 高可用性…...

No.1|Godot|俄罗斯方块复刻|棋盘和初始方块的设置

删掉基础图标新建assets、scenes、scripts文件夹 俄罗斯方块的每种方块都是由四个小方块组成的&#xff0c;很适合放在网格地图中 比如网格地图是宽10列&#xff0c;高20行 要实现网格的对齐和下落 Node2D节点 新建一个Node2D 添加2个TileMapLayer 一个命名为Board&…...

二 RK3568 固件中打开 ADB 调试

一 usb adb Android 系统,设置->开发者选项->已连接到计算机 打开,usb调试开关打开 通过 usb otg 口连接 开发上位机 (windows/linux) 上位机安装 adb 服务之后 , 通过 cmd/shell: #1 枚举设备 adb devices #2 进入 android shell adb shell # 3 验证上传下载…...

鸿蒙报错Init keystore failed: keystore password was incorrect

报错如下&#xff1a; > hvigor ERROR: Failed :entry:defaultSignHap... > hvigor ERROR: Tools execution failed. 01-13 16:35:55 ERROR - hap-sign-tool: error: Init keystore failed: keystore password was incorrect * Try the following: > The key stor…...

Java学习笔记(二十三)

1 CacheEvict CacheEvict是Spring框架中用于清空缓存的注解。以下是对CacheEvict注解的详细介绍&#xff1a; 1.1 作用 CacheEvict注解的主要作用是删除缓存中的数据。在方法执行后或执行前&#xff08;根据配置&#xff09;&#xff0c;它可以清空指定的缓存项或整个缓存区…...

TIOBE编程语言排行靠前的编程语言的吉祥物

Python的吉祥物&#xff1a;小蟒蛇 Python语言的吉祥物是一只名叫"Pythonidae"&#xff08;或简称"Py"&#xff09;的小蟒蛇。这个吉祥物由Tobias Kohn设计于2005年&#xff0c;它的形象借鉴了真实的蟒蛇&#xff0c;但加入了一些可爱和友善的特点。小蟒蛇…...

Redis集群部署详解:主从复制、Sentinel哨兵模式与Cluster集群的工作原理与配置

集群部署形式 1、主从复制1.1 工作机制1.2 配置实现1.3 优缺点1.4 部署形式1.5 主从复制优化 2、Sentinel 哨兵模式2.1 工作机制2.2 配置实现2.3 优缺点2.4 哨兵机制选举流程2.5 脑裂问题解决方案 3、Redis Cluster3.1 工作机制3.2 配置实现3.3 优缺点3.4 故障转移3.5 哈希槽为…...

Dubbo泛化调用

本文记录下利用dubbo泛化调用实现网关server收http请求&#xff0c;然后转发给dubbo服务&#xff0c;然后收到dubbo响应的功能原理。 关键点1&#xff1a;dubbo泛化调用。可根据(注册中心地址、接口名&#xff0c;方法名&#xff0c;参数类型&#xff09;唯一确定一个dubbo服务…...

SpringBoot工程快速启动

1.问题导入 以后我们和前端开发人员协同开发&#xff0c;而前端开发人员需要测试前端程序就需要后端开启服务器&#xff0c;这就受制于后端开发人员。 为了摆脱这个受制&#xff0c;前端开发人员尝试着在自己电脑上安装 Tomcat 和 Idea &#xff0c;在自己电脑上启动后端程序&a…...

Docker实践:部署Docker管理工具DockerUI

Docker实践&#xff1a;部署Docker管理工具DockerUI 前言一、DockerUI介绍1.1 DockerUI概述1.2 镜像说明 二、检查本地Docker环境三、拉取DockerUI镜像四、创建DockerUI容器五、访问DockerUI六、DockerUI的基本使用6.1 查询宿主机容器情况6.2 查询Docker镜像列表6.3 查看容器配…...

【优先算法】滑动窗口--(结合例题讲解解题思路)(C++)

目录 1. 例题1&#xff1a;最大连续1的个数 1.1 解题思路 1.2代码实现 1.3 错误示范如下&#xff1a;我最开始写了一种&#xff0c;但是解答错误&#xff0c;请看&#xff0c;给大家做个参考 2. 将 x 减到 0 的最小操作数 2.1解题思路 2.2代码实现 1. 例题1&#xff…...

嵌入式系统Linux实时化(四)Xenomai应用开发测试

1、Xenomai 原生API 任务管理 Xenomai 本身提供的一系列多任务调度机制,主要有以下一些函数: int rt_task_create (RT_TASK task, const char name, int stksize, int prio, intmode) ; 任务的创建;int rt_task_start(RT_TASK task, void(entry)(void cookie), void cookie…...

深度剖析RabbitMQ:从基础组件到管理页面详解

文章目录 一、简介二、Overview2.1 Overview->Totals2.2 Overview->Nodesbroker的属性2.3 Overview->Churn statistics2.4 Overview->Ports and contexts2.5 Overview->Export definitions2.6 Overview->Import definitions 三、Connections连接的属性 四、C…...

算法每日双题精讲 —— 二分查找(二分查找,在排序数组中查找元素的第一个和最后一个位置)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa…...

Golang—— error 和 panic

本文详细介绍Golang的两种错误处理机制&#xff1a;error 和 panic。 文章目录 Golang 的错误处理机制概述error特点代码示例基本用法创建 error panic特点运行时错误示例defer 和 recover 的结合使用代码示例基本用法创建 panic panic 的执行机制 error 和 panic 的对比生产环…...

xcrun: error: invalid active developer path 解决

在拉取 github 代码时&#xff0c;提示如下报错&#xff1a; xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 原因是&#xff1a;这是由于 Xcode command line t…...

Jmeter配置服务代理器 Proxy(二)

1.创建脚本记录器 2.配置&#xff1a;Jmeter代理、端口、记录目标等 3.配置谷歌浏览器代理 浏览器配置代理的详细教程可参考&#xff1a;使用whistle代理-CSDN博客 4.启动Jmeter记录器 点击ok后弹出这个界面&#xff0c;生成了证书&#xff1a; 5.给浏览器安装Jmeter代理的证书…...

小黑工具人日常积累中:sqlserver中切割字符串,取首个子串

SELECTSUBSTRING(表名字, 1, CHARINDEX(分隔符, 字段名) - 1) AS FirstPart FROM表名字 WHERECHARINDEX(分隔符, 字段名) > 0继续尝试: 提取第二个子串 窗口函数...

港科夜闻 | 香港科大与微软亚洲研究院签署战略合作备忘录,推动医学健康教育及科研协作...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与微软亚洲研究院签署战略合作备忘录&#xff0c;推动医学健康教育及科研协作。根据备忘录&#xff0c;双方将结合各自于科研领域的优势&#xff0c;携手推动医学健康领域的交流与合作。合作方向将涵盖人才培训、…...

掌握Golang strings包:高效字符串处理指南

掌握Golang strings包&#xff1a;高效字符串处理指南 引言为什么要学习和掌握strings包本教程的目标 基本用法strings包概述导入strings包常用函数列表及简要介绍 字符串创建与基本操作创建字符串字符串连接&#xff1a;Join重复字符串&#xff1a;Repeat修改字符串&#xff1…...

关于husky8.0 与 4.0的配置

husky的场景使用很多&#xff0c;一般大多场景是在配置git commit 命令拦截hook, 校验 commit-msg 格式规范。以下环境默认&#xff1a;git > 2.27.0, node >14 1、安装huskey8.0.1 npm install --save-dev husky8.0.1 2、初始化配置文件 在package.json scripts 属性…...

【RK3588 Linux 5.x 内核编程】-Linux内核数据结构详解(双向链表、基数树、位数组)

Linux内核数据结构详解(双向链表、基数树、位数组) 文章目录 Linux内核数据结构详解(双向链表、基数树、位数组)1、双向链表2、基数树3、位数组3.1 Linux内核中的位数组和位操作3.2 位数组声明3.3 特定于架构的位操作3.4 常见的位操作Linux内核提供了不同的数据结构实现,如…...

3.Qt Quick-QML地图引擎之v4.3版本(新增动态轨迹线/海图/天地图街道/天地图卫星)

在上个版本Qt Quick-QML地图引擎之v4版本(新增多模型切换/3D模型欧拉角模拟)_qt加载3d地图-CSDN博客更新了3D模拟功能&#xff0c;在4.3版本增加动态轨迹线、三个地图(海图/天地图街道/天地图卫星)。 4.3版本已经支持qt6 cmake版本&#xff0c;而4.3版本以下支持qt5版本&#x…...

使用WebdriverIO和Appium测试App

1.新建项目 打开Webstorm新建项目 打开终端输入命令 npm init -y npm install wdio/cli allure-commandline --save-dev npx wdio config 然后在终端依次选择如下&#xff1a; 然后在终端输入命令&#xff1a; npm install wdio/local-runnerlatest wdio/mocha-frameworkla…...

前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单

一、最早的灵感 最早的灵感来自sprider / 网络爬虫 / 爬虫配置&#xff0c;在爬虫爬取网站文章时候&#xff0c;会输入给爬虫一个配置文件&#xff0c;里边的内容是一个json对象。里边包含了所有想要抓取的页面的信息。爬虫通过这个配置就可以抓取目标网站的数据。其实本文要引…...

工具推荐:PDFgear——免费且强大的PDF编辑工具 v2.1.12

PDFgear——免费且强大的PDF编辑工具 v2.1.12 软件简介 PDFgear 是一款 完全免费的 PDF 软件&#xff0c;支持 阅读、编辑、转换、合并 以及 跨设备签署 PDF 文件&#xff0c;无需注册即可使用。它提供了丰富的 PDF 处理功能&#xff0c;极大提升了 PDF 文件管理的便捷性和效…...

【Unity3D】【已解决】TextMeshPro无法显示中文的解决方法

TextMeshPro无法显示中文的解决方法 现象解决方法Assets 目录中新建一个字体文件夹在C:\Windows\Fonts 中随便找一个中文字体的字体文件把字体文件拖到第一步创建的文件夹中右键导入的字体&#xff0c;Create---TextMeshPro---Font Asset&#xff0c;创建字体文件资源把 SDF文件…...

【Unity】使用UniRx来快速完成Unity中的信号层开发工作。

访问官方 网址&#xff1a;https://github.com/neuecc/UniRx/ UniRx&#xff08;Unity反应式扩展&#xff09;是.NET 反应式扩展的重新实现。官方 Rx 实现很棒&#xff0c;但在 Unity 上不起作用&#xff0c;并且存在 iOS IL2CPP 兼容性问题。此库修复了这些问题&#xff0c;并…...

FPGA工程师成长四阶段

朋友&#xff0c;你有入行三年、五年、十年的职业规划吗&#xff1f;你知道你所做的岗位未来该如何成长吗&#xff1f; FPGA行业的发展近几年是蓬勃发展&#xff0c;有越来越多的人才想要或已经踏进了FPGA行业的大门。很多同学在入行FPGA之前&#xff0c;都会抱着满腹对职业发…...

配置Kubernetes从节点与集群Calico网络

在上一篇博客中&#xff0c;我们成功安装并初始化了Kubernetes的主节点&#xff0c;并且看到了集群初始化成功的标志信息。接下来&#xff0c;我们将继续安装从节点&#xff08;worker nodes&#xff09;&#xff0c;以构建一个完整的Kubernetes集群。 步骤回顾 在上一步中&a…...

【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统

文章目录 参考资料云盘资料软硬件环境手机解锁刷机驱动绑定账号和设备解锁手机 Mindows工具箱安装工具箱和修复下载下载安卓和woa资源包第三方Recovery 一键安装Windows准备工作创建分区安装系统 效果展示Windows和Android一键互换Win切换安卓安卓切换Win 删除分区 参考资料 解…...

【Qt】01-了解QT

踏入QT的殿堂之路 前言一、创建工程文件1.1 步骤介绍1.2 编译介绍方法1、方法2、编译成功 二、了解框架2.1 main.cpp2.2 .Pro文件2.2.1 注释需要打井号。2.2.2 F1带你进入帮助模式2.2.3 build文件 2.3 构造函数 三、编写工程3.1 main代码3.2 结果展示 四、指定父对象4.1 main代…...

STC的51单片机LED点灯基于KEIL

前言&#xff1a; 该文源于回答一个朋友的问题&#xff0c;代码为该朋友上传&#xff0c;略作修改&#xff0c;在此说明问题以及解决问题的思路&#xff0c;以减少新手错误。 电路图&#xff1a; 该位朋友未上传电路图&#xff0c;说明如下&#xff1a; stc8g1k08a-sop8控制…...

AV1视频编解码简介、码流结构(OBU)

我的音视频/流媒体开源项目(github) 目录 一、AV1编码技术 二、AV1码流结构(OBU) 三、IVF文件格式 四、ffmpeg支持AV1 五、关于常见格式对AV1的封装 一、AV1编码技术 AV1是由开放媒体联盟(AOM&#xff0c;Alliance for Open Media)在2018年发布的&#xff0c;AV1的前身…...

Service Work离线体验与性能优化

Service Work离线体验与性能优化 引言 先放个意外事件&#xff0c;万事开头难&#x1f923;&#x1f923;&#x1f923; 原计划是分享离线应用与数据资源缓存的应用实践&#xff0c;结果发现这一技术已被web标准废弃 曾经做过一个PC应用&#xff0c;业务需求要求应用具备容灾…...

linux之进程信号(初识信号,信号的产生)

目录 引入一、初识信号(信号预备知识)1.生活中的信号2.Linux中的信号3.信号进程得出的初步结论 二、信号的产生1.通过终端输入产生信号拓展: 硬件中断2.调用系统函数向进程发信号3.硬件异常产生信号4.软件条件产生信号拓展: 核心转储技术总结一下&#xff1a; 引入 一、初识信…...

为深度学习创建PyTorch张量 - 最佳选项

为深度学习创建PyTorch张量 - 最佳选项 正如我们所看到的&#xff0c;PyTorch张量是torch.Tensor​ PyTorch类的实例。张量的抽象概念与PyTorch张量之间的区别在于&#xff0c;PyTorch张量为我们提供了一个可以在代码中操作的具体实现。 在上一篇文章中&#xff0c;我们看到了…...

MySQL 与 Redis 数据一致性 2

1. 强一致还是最终一致?2. 先写 MySQL 还是先写Redis?case 1 3. 缓存(Redis)更新还是清除?更新策略更新策略会有数据不一致问题?数据不一致的概率与影响如果使用监听binlog更新数据还会出现数据不一致问题?binlog的消费问题 使用消息队列行不行?其他方案总结: 数据不一致…...

Git | git reset命令详解

关注&#xff1a;CodingTechWork 引言 Git 是一款非常流行的分布式版本控制工具&#xff0c;它帮助开发者有效地管理代码历史&#xff0c;支持多种功能来帮助团队协作、追踪修改和维护代码质量。git reset是 Git 中最强大、最复杂的命令之一&#xff0c;它的主要作用是重置当前…...

Linux高并发服务器开发 第十四天(dup/duo2/fcntl 进程 pcb进程控制块 环境变量)

目录 1.dup 和 dup2 1.1dup 1.2dup2 2.fcntl 3.进程 3.1进程和程序 3.2并发 3.3cpu 3.5pcb进程控制块 3.6进程状态 4.环境变量 1.dup 和 dup2 1.1dup - 将 文件描述符 &#xff0c;复制产生“新文件描述符” 并返回。新、旧文件描述符&#xff0c;指向同一文件。 …...

[MySQL | 二、基本数据类型]

基本数据类型 一、数值类型举例表结构1. 整数类型zerofill属性 与 int(n) 中 n 的关系 2.bit类型3. 小数类型float类型decimal类型 二、字符串类型1. char2. varchar如何选择定长或变长字符串&#xff1f; 3. 日期时间类型(date datetime timestamp)4. enum枚举类型5. set多选类…...

第G1周:生成对抗网络(GAN)入门

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 本人往期文章可查阅&#xff1a; 深度学习总结 基础任务 1.了解什么是生成对抗网络2.生成对抗网络结构是怎么样的3.学习本文代码&am…...

ROS2 准备工作(虚拟机安装,Ubuntu安装,ROS2系统安装)

准备工作 虚拟机安装 大家可以自行去安装VMware链接&#xff1a;https://pan.baidu.com/s/1KcN1I9FN--Sp1bUsjKqWVA?pwd6666 提取码&#xff1a;6666(提供者&#xff1a;零基础编程入门教程) 教程&#xff1a;【【2025最新版】VMware虚拟机安装教程&#xff0c;手把手教你免…...

FreeType 介绍及 C# 示例

FreeType 是一个开源的字体渲染引擎&#xff0c;用于将字体文件&#xff08;如 TrueType、OpenType、Type 1 等&#xff09;转换为位图或矢量图形。它广泛应用于操作系统、图形库、游戏引擎等领域&#xff0c;支持高质量的字体渲染和复杂的文本布局。 FreeType 的核心功能 字体…...

BertTokenizerFast 和 BertTokenizer 的区别

BertTokenizerFast 和 BertTokenizer 都是用于对文本进行标记化的工具&#xff0c;主要用于处理和输入文本数据以供 BERT 模型使用。它们都属于 HuggingFace 的 transformers 库。 主要区别 底层实现&#xff1a; BertTokenizer: 这是一个使用纯 Python 实现的标记器&#xff…...

OpenGL中Shader LOD失效

1&#xff09;OpenGL中Shader LOD失效 2&#xff09;DoTween的GC优化 3&#xff09;开发微信小程序游戏有没有类似Debug真机图形的方法 4&#xff09;射线和Mesh三角面碰撞检测的算法 这是第418篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了U…...

[操作系统] 深入理解约翰·冯·诺伊曼体系

约翰冯诺依曼&#xff08;John von Neumann&#xff0c;1903年12月28日—1957年2月8日&#xff09;&#xff0c;原名诺伊曼亚诺什拉约什&#xff08;Neumann Jnos Lajos&#xff09;&#xff0c;出生于匈牙利的美国籍犹太人数学家&#xff0c;20世纪最重要的数学家之一&#xf…...

计算机网络(五)运输层

5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…...