网络安全 | 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());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL美化器优化

文章目录 1.目录2.代码 1.目录 2.代码 package com.sunxiansheng.mybatis.plus.inteceptor;import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.*; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.*…

CC工具箱使用指南:【类Json文本转面要素】

一、简介 有一些面要素是通过Json数据存储的&#xff0c;但有可能在某些转化过后&#xff0c;变成了文本信息存储在字段里&#xff0c;如下截图&#xff1a; 字段值中保存了完整的点坐标信息。 工具要做的是将这点坐标信息提取出来&#xff0c;创建成面要素。 二、工具参数介…

英伟达Project Digits赋能医疗大模型:创新应用与未来展望

英伟达Project Digits赋能医疗大模型&#xff1a;创新应用与未来展望 一、引言 1.1 研究背景与意义 在当今数字化时代&#xff0c;医疗行业作为关乎国计民生的关键领域&#xff0c;正面临着前所未有的挑战与机遇。一方面&#xff0c;传统医疗模式在应对海量医疗数据的处理、复…

力扣 岛屿数量

从某个点找&#xff0c;不断找相邻位置。 题目 岛屿中被“0”隔开后 &#xff0c;是每一小块状的“1”&#xff0c;本题在问有多少块。可以用dfs进行搜索&#xff0c;遍历每一个点&#xff0c;把每一个点的上下左右做搜索检测&#xff0c;当检测到就标记为“0”表示已访问过&a…

An FPGA-based SoC System——RISC-V On PYNQ项目复现

本文参考&#xff1a; &#x1f449; 1️⃣ 原始工程 &#x1f449; 2️⃣ 原始工程复现教程 &#x1f449; 3️⃣ RISCV工具链安装教程 1.准备工作 &#x1f447;下面以LOCATION代表本地源存储库的安装目录&#xff0c;以home/xilinx代表在PYNQ-Z2开发板上的目录 ❗ 下载Vivad…

Windows下调试Dify相关组件(2)--后端Api

1.部署依赖的服务&#xff08;代码最外层的docker目录&#xff09; 1.1 将middleware.env.example复制&#xff0c;并改名为middleware.env。 1.2 查看docker-compose.middleware.yaml&#xff0c;有5个服务 db&#xff1a;postgres数据库。 redis&#xff1a;redis缓存。 sa…

CSS | CSS实现两栏布局(左边定宽 右边自适应,左右成比自适应)

目录 一、左边定宽 右边自适应 1.浮动 2.利用浮动margin 3.定位margin 4.flex布局 5.table 布局 二、左右成比自适应 1:1 1flex布局 table布局 1:2 flex布局 <div class"father"><div class"left">左边自适应</div><div class"r…

Spring Framework 5.3.x源码构建 (jdk-1.8, gradle 7.5.1, idea2024.3)

1、下载jdk安装并配置环境变量&#xff08;自行百度&#xff09; https://www.oracle.com/java/technologies/downloads/#java8 2、下载spring-framework源码&#xff0c;切换分支到5.3.x https://github.com/spring-projects/spring-framework.git 备用地址 https://gitco…

合洁科技电子洁净工程公司分享晶圆厂百级净化车间建设的关键要点

电子厂百级净化车间的设计装修是一个复杂而精细的过程&#xff0c;它直接关系到电子产品的生产质量、员工的健康安全以及生产环境的稳定性。为了满足高洁净度、低污染的生产要求&#xff0c;设计装修过程中需要综合考虑多个方面的因素。以下是合洁科技电子净化工程公司对电子厂…

CentOS7下Spark-2.4.3-bin-without-hadoop版本安装详细图文教程

1、该Spark版本说明 1、依赖关系 该版本不包含Hadoop的依赖库。适用于那些不直接需要Hadoop集群或者已经通过其他方式管理Hadoop依赖的用户。用户可以在不依赖Hadoop的环境中运行Spark&#xff0c;或者如果已有一个Hadoop环境但希望使用Spark自带的Hadoop客户端库&#xff0c;…

论文解析 | 基于语言模型的自主代理调查

论文 《A Survey on Large Language Model-based Autonomous Agents》 对基于大型语言模型&#xff08;LLM&#xff09;的自主智能体&#xff08;Autonomous Agents&#xff09;进行了全面调查。随着大型语言模型&#xff08;如 GPT 系列、BERT、T5 等&#xff09;的快速发展&a…

【DB-GPT】开启数据库交互新篇章的技术探索与实践

一、引言&#xff1a;AI原生数据应用开发的挑战与机遇 在数字化转型的浪潮中&#xff0c;企业对于智能化应用的需求日益增长。然而&#xff0c;传统的数据应用开发方式面临着诸多挑战&#xff0c;如技术栈复杂、开发周期长、成本高昂、难以维护等。这些问题限制了智能化应用的…

centos9设置静态ip

CentOS 9 默认使用 NetworkManager 管理网络&#xff0c;而nmcli是 NetworkManager 命令行接口的缩写&#xff0c;是一个用来进行网络配置、管理网络连接的命令工具&#xff0c;可以简化网络设置&#xff0c;尤其是在无头&#xff08;没有图形界面&#xff09;环境下。 1、 cd…

单片机(MCU)-简单认识

简介&#xff1a; 内部集成了CPU&#xff0c;RAM&#xff0c;ROM&#xff0c;定时器&#xff0c;中断系统&#xff0c;通讯接口等一系列电脑的常用硬件功能。 单片机的任务是信息采集&#xff08;依靠传感器&#xff09;&#xff0c;处理&#xff08;依靠CPU&#xff09;&…

Linux之读者写者模型与特殊锁的学习

目录 读者写者模型 特殊锁 悲观锁 自旋锁 在前几期&#xff0c;我们学习了多线程的生产者和消费者模型&#xff0c;生产者和消费者模型中&#xff0c;有三种关系&#xff0c;两个角色&#xff0c;一个场所&#xff0c;那么读者写者模型和生产者消费者模型有什么关联吗&…

mycat介绍与操作步骤

文章目录 1.分库分表2.mycat 入门2.1 概述2.2 案例&#xff1a;水平分表1&#xff09;准备工作2&#xff09;配置3&#xff09;启动并测试 3.mycat 配置详解3.1 schema.xml3.2 rule.xml3.3 server.xml 4.mycat 分片&#xff1a;垂直拆分1&#xff09;准备工作2&#xff09;配置…

OSPF - 特殊报文与ospf的机制

&#x1f460;1 携带FA地址的5类LSA 除去7类转5类的LSA会携带FA地址&#xff0c;还有一种情况会有FA地址 FA地址:forwarding address 转发地址&#xff0c;解决次优路径&#xff0c;避免环路5类LSA FA地址不为0&#xff0c;则直接通过FA地址去往目标网段 FA地址为0&#xff0c…

django基于Python的电影推荐系统

Django 基于 Python 的电影推荐系统 一、系统概述 Django 基于 Python 的电影推荐系统是一款利用 Django 框架开发的智能化应用程序&#xff0c;旨在为电影爱好者提供个性化的电影推荐服务。该系统通过收集和分析用户的观影历史、评分数据、电影的属性信息&#xff08;如类型…

硬件设计-齐纳管

目录 摘要 详情 齐纳管的工作电流、 摘要 齐纳管&#xff08;Zener Diode&#xff09;是一种特殊的二极管&#xff0c;它能够在特定的反向电压下保持电流稳定。正常情况下&#xff0c;二极管只允许正向电流通过&#xff0c;而阻止反向电流流过。而齐纳管在一定的反向电压下可…

阿里云ios镜像源

阿里云镜像源&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载centos7