【代码审计】常见漏洞专项审计-业务逻辑漏洞审计
❤️博客主页: iknow181
🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP
🎉欢迎大家点赞👍收藏⭐评论✍
0x01 漏洞介绍
1、 原理
业务逻辑漏洞是一类特殊的安全漏洞,业务逻辑漏洞属于设计漏洞而非实现漏洞,是业务逻辑设计不严谨导致的漏洞。大多数业务逻辑漏洞没有明显的攻击特征,难以通过漏洞扫描的方式发现,也难以通过安全设备来防护。
2、 特点
- 更多依据黑盒经验发现,无法通过工具检测
- 白盒发现难度大,审计时间成本高【需要非常熟悉业务功能及源码架构对应关系】,但是发现更加全
面,准确性相比黑盒差
3、应用场景
- 系统登录后才能访问功能,进入系统首页时会看到各种功能模块的增删改查(往往首页面会进行登录验
证) - 需要追踪到后端,逐层走读代码判断是否进行授权访问
- 此类漏洞一般发生在比较老的技术,往往是程序员手动进行权限验证不全面或因安全意识不足导致。
- 文件下载或数据浏览(查看),程序员针对访问数据仅校验是否登录或最低权限验证,但权限应通过用
户关联角色、角色关联权限控制到API接口级别(有的系统甚至API权限控制不全面造成越权),除此外
权限未控制到某数据表中的各条数据,因此产生了数据遍历漏洞。
4、审计流程
- 通过后端controller层代码或找业务获取系统的所有API接口,梳理出本系统的API列表。
- 需要追踪到后端,逐层走读代码判断是否进行授权访问分析本系统的权限校验技术和逻辑,特别是对于
登录验证控制的API,寻找遗漏点。 - 查看字符类型以及复杂度,被遍历字段是否为整形,是否为有规律的字符串【防止被猜测遍历】,但需
要确定是否进行数据鉴权 - 确定过滤器机制是否完整,即是否存在过滤器特殊符号绕过的情况
5、修复措施
- 对API全面梳理全面校验,最大限度的保证不遗漏API接口,对所有的API进行鉴权处理。【防接口越
权】 - 通过白名单机制,仅允许登录相关操作,例如登录前相关资源获取(常见的有验证码的获取)等,其他
一律都必须登录之后才能访问,如确实业务需要登录之前可访问,需要配置到白名单中。【防接口越
权】 - 字段设置一定复杂度的随机字符串,权限控制到数据级别,也就是说访问的数据要去用户关联起来。
【防数据越层次越权】
0x02 常见的分类
- 数据可遍历
- 越权
- API未授权
- 用户名、密码爆破【登录认证问题】
- 支付漏洞
- 验证码问题【验证码不失效、一码多用、可被识别、可被猜测、可被绕过】
0x03 业务逻辑漏洞-API未授权漏洞【接口越权】
1、审计技巧
- 通过后端controller层代码或找业务获取系统的所有API接口,梳理出本系统的API列表。系统的API列表。
- 分析本系统的权限校验技术和逻辑,特别是对于登录验证控制的API,寻找遗漏点。
- 系统登录后才能访问功能,进入系统首页时会看到各种功能模块的增删盖查(往往首页面会进行登录验证)需要追踪到后端,逐层走读代码判断是否进行授权访问。
- 此类漏洞一般发生在比较老的技术,往往是程序员手动进行权限验证不全面或因安全意识不足导致。
- 常见的验证技术shiro、Spring Security等成熟而又完善的权限验证框架大大减少了漏洞的产生。
2、修复方案
- 对API全面梳理全面校验,最大限度的保证不遗漏API接口,对所有的API进行鉴权处理。
- 通过白名单机制,仅允许登录相关操作,例如登录前相关资源获取(常见的有验证码的获取)等,其他一律都必
- 须登录之后才能访问,如确实业务需要登录之前可访问,需要配置到白名单中。
3、审计案例
分析思路:
(1)先看权限控制(如何解决AP未授权的问题),确定是否动态使用了5张表完成了权限与用户、角
色的动态绑定
通过查看实体类发现未采用动态权限控制。进行下一步分析后,得出该权限通过手动的简单编码处理了权限控制。
(2)看权限控制的技术(如何解决API未授权的问题)是否是手动校验或者是使用了比较的老的比较
简单的filer
发现未使用成熟的权限框架校验技术,未使用手动编写filter过滤器,其实就是我们加大未业务逻辑漏洞审
计的决心。
(3)看数据是如何鉴权的,需要分析详细的API及业务系统功能,看各自的数据获取是否合理。
第一点,简单来说看数据是否公开,公开就忽略
第二次,对于属于私有的数据,查看是否校验了当前用户登录的身份(登录用户本人或管理员)
例如学生成绩查询系统,能够查看学生成绩的,只有学生本人以及你的教师。
以学生成绩查看业务功能为例,分析:
最后确定这个接口只要传入ID,就能够获取当成绩,追溯整个的漏洞链中未发现进行了合格的校验
如果我能确定,未对当前登录用户的权限进行控制,就可以得出该代码存在着API未授权漏洞。
1、通过通读源码,发现考试系统未使用任何安全框架,未使用Filter过滤器进行登录验证,通过手写
登录方法对用户是否存在,密码是否正确以及登录身份判断后分别跳转到对应页面(学生、教师、管
理员),未真正进行API与用户、角色的绑定校验权限,全局存在API未授权问题。
2、对梳理的API列表逐一按照参数要求在不登录的情况下访问后成功获取对应数据,其他不在一一列
举。
总结:需要对登录身份进行权限控制,简单的说就是验证查询的学生成绩的id是不是登录用户的ID,
校验手动参考如下:
关于水平越权的修复的问题:
1、数据层次导致的越权原因,直接通过sid查询了某条数据,未对当前登录的用户进行校验:
2、如何鉴权,应该获取到当前登录用户的 ID,和查询的数据所属用户进行比对
除了API未授权,未通过用户的角色决定该接口是否被授权的用户访问,仅仅是接口的访问,如果能够控制接口的请求,这个授权就完美了。但是我们通过数据层次上控制了不同角色用户访问数据的权限并且通过sql语句的限制条件控制了数据遍历访问的问题。所以修复到这里,也不会出现越权问题。
0x04 shiro框架介绍
Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越多,因为它相当简单,对比Spring Security,可能没有 Spring Security 做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的 Shiro 。
Shiro 简化开发应用,能够完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。
- Authentication:身份认证 / 登录,验证用户是不是拥有相应的身份;
- Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
- Session Management:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的;
- Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
- Web Support:Web 支持,可以非常容易的集成到 Web 环境;
- Caching:缓存,比如用户登录后,其用户信息、拥有的角色 / 权限不必每次去查,这样可以提高效率;
- Concurrency:shiro 支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过
去; - Testing:提供测试支持;
- Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
- Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。
0x05 业务逻辑漏洞审计-水平越权【简单】案例
1、审计技巧
- 被遍历字段变量类型为整型
- 被遍历字段变量为有规律的字符串
- 确定是否进行数据鉴权
相同角色的用户才会考虑水平越权的问题(如果用户的角色不一样,那低权限的账号根本就没有机会访问到高权限账号的接口),也就是说两个用户一定能够同时访问这个API,才会继续往下考虑水平越权的问题。
2、应用场景
文件下载或数据浏览(查看),程序员针对访问数据仅校验是否登录或最低权限验证,但权限一般是通过用户关联角色、角色关联权限控制到AP接口级别(有的系统甚至AP权限控制不全面造成越权),权限未控制到某数据表中的各条数据,因此产生了数据遍历漏洞。
3、修复方案
- 设置具有一定复杂度的随机字符串,例如随机12位或16随机字符串(迫不得以)。
- 将权限控制到数据级别,也就是说访问的数据要去用户关联起来(最优解)。
4、审计案例
1、以考试系统为例,查看李丽学生的成绩,请求student/showScore?sid=1
2、确定sid表示查询的李丽的成绩,根据审计技巧猜测sid是否是一个可遍历的字段且在数据级别未进
行校验,因此进入后端参数追踪,发现sid为一个整数易被遍历且查询数据前未进行任何权限和校验,从
而造成了登录李丽账号后可遍历其他任意学生的成绩信息。
3、利用黑盒遍历sid可随意查看其他同学的成绩
0x06 业务逻辑漏洞-垂直越权
1、漏洞原理介绍
- 越权漏洞分类水平越权和垂直越权,同级别权限的用户之间能访问、操作范围外数据或请求接口的为水平越权,低权限账号能够访问或操作高权限数据或请求接口的为垂直越权。
- 越权漏洞主要发生在面向不同角色的用户提供不同服务或功能的系统,例如OA、HR等应用类、管理类系统,特别是使用老技术架构的系统发生越权情况更为普遍。但如果使用了新技术,一般会使用较为成熟的框架机制进行权限控制,从而大大觉少了越权漏洞的发生。
2、审计漏洞突破口
- 查看后端索使用的技术,特别是使用的权限认证技术,熟悉shiro,spring-security等框架的鉴权原理
- 梳理所有的API,进行分类,追踪api请求,查看是否会进行权限验证。
- 对于较老技术架构的系统,往往只是进行了登录验证或API仅进行了最低权限角色的认证,未全部将角色和对应的API匹配起来,导致了越权漏洞的产生
3、权限控制原理
- 将后端所有被请求的API均当做权限(API请求路径)存储到数据库权限表中
- 同时将角色表和权限表关联起来,将用户表和角色表管理起来
- 用户在请求API时,权限验证框架会依据用户信息查询对应角色所用户的权限,权限足够才会正常请求API,否则将会拦截。只要API未完全通过角色和用户绑定起来就会存在越权漏洞的产生。
登录认证案例:
4、审计案例-1
1、在新医院管理系统中,使用普通用户(低权限)访问医院管理的功能,管理员(高权限)访问系统
用户的功能,尝试查看是否存在垂直越权行为
2、分别发送请求后抓包发现存在医院管理员能够查看系统用户的信息(此API越权)
3、首先设置管理员和普通用户的角色,不允许低权限用户操作系统管理功能模块
4、登录低权限账号后发现页面确实不能访问系统管理功能
5、随后经过梳理该系统使用Shiro框架权限验证,简单来讲就是框架自动将请求的API接口和我们数据
库权限表关联起来,用户登录-获取用户Id-查询所属角色-查询权限列表-shiro框架会比对待请求的用
户接口路径是否在范围内,如果在就放行,不在就拦截。此次能越权是因为确实在列表内:
6、因此接口能否越权的关键看权限列表控制的是否合理,也就是所看API是否完全和用户、角色关联
起来是关键,部分API关联不合理成为了漏网之鱼,数据越权需要看当前数据是否和给用户授权(通过
白名单存储所有能访问用户的标识与登录用户进行比对,如果在范围内允许访问,否则不允许访问)
0x07 业务逻辑漏洞-字段爆破
- 常见的爆破字段有用户名、密码、验证码(黑盒)
- 从白盒来讲,通过审计源代码包括字段的类型,例如整形,有规律的字符串作为数据的唯一标识
- 此类漏洞通过黑盒直接测试比较方便,一般情况下只有使用了验证码(图形验证码、短信验证码)一般情况下不可被破解。
1、审计方法
- 追踪登录功能,查看后端源码是否在登录成功前进行了验证码的刷新(防失效)。
- 在修改密码处可能不会再进行验证码设置,从而造成用户名爆破。
- 搜索是否提示用户名不存在且在未关联验证码的情况。
2、修复方案
- 凡是在涉及到用户名判断的情况反馈模糊提示信息,不得直接提示用户名不存在。
- 凡是判断用户名和密码的认证情况,需要增加验证码判断逻辑来避免爆破。
- 设置基于IP锁定和一定时间内账号错误输入次数机制,来避免爆破密码的情况。
- 通过增加具有一定复杂度的验证码来方爆破
0x08 业务逻辑漏洞-支付漏洞
支付漏洞一般是程序员对异常的情况未进行安全考虑,具体包括:
- 支付、取款、转账任意金额的修改,未对正负数、原金额足额比较
- 来自前端的金额直接执行支付操作,未对前端折扣金额等于后端的金额比对,是产生支付漏洞是一种常见的现
象。
如果单价,折扣,原价,积分等等的不与数据库进行比对的话,将会出现任意金额下单,购买的业务
逻辑漏洞
如果未对同一客户端IP、同一用户、同一时间段内重复下单的频率进行先限制和提醒,将会造成无限
刷单。
审计技巧:寻找支付相关业务逻辑,确定是否对金额进行负数、原账号金额、前端支付变量与数据库
真正定价比较。
0x09 业务逻辑-filter 过滤器绕过
filter被称为过滤器,是Servlet2.3新增的一个特性,同时它也是Servlet技术中最实用的技术。开发人员可以通过Filterj技术,能够实现对所有Wb资源的管理,如实现权限访问控制、过滤敏感词汇、压缩响应信息、全局编码配置、登录认证等一些高级功能。
1、filter 过滤器../绕过
1. 绕过原理分析
/user/loginServlet、/user/toLoginServlet开头,符合匹配的规则,而匹配上该规则后则是直接放
行,让系统认为访问路径是一个登录的路径,但在后面加入../进行跳转到根目录,并且拼接上
indexServlet,这时候实际访问到的是http://127.0.0.1:8082/user/indexServlet
2. 修复方案
String uri = request.getRequestURI();
if(uri.contains("./")){resp.getwriter().write("error");return;}
2、手动filter过滤器-;绕过
1. 绕过原理分析
URL中有一个保留字符分号;,主要为参数进行分割使用,有时候是请求中传递的参数太多了,所以使
用分号;将参数对(key=value)连接起来作为一个请求参数进行传递。再来看到代码,代码中识别.do
和.action的后缀的字符,而加入;加上随便内容后,代码中就识别不到了。则会走到最下面的
chain.doFilter(request,resp);,而在后面添加;分号不会对地址的访问有任何影响。
2. 修复方案
3、 总结
前面提到过request.getRequestURL(),这些危险字符并不会自动剔除掉。可重点关注该方法。
关于手写过滤器的绕过的总结:
(1)两个场景,第一是基于../截断,第二是基于;截断,对应通过黑名单通过相关API获取uri剔除特殊
的字符去分别防止两个场景的绕过
(2)当你遇到了手写的过滤器,要基于以上两个场景去判断是否存在该问题
相关文章:

【代码审计】常见漏洞专项审计-业务逻辑漏洞审计
❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 0x01 漏洞介绍 1、 原理 业务逻辑漏洞是一类特殊的安全漏洞,业务逻辑漏洞属于设计漏洞而非实…...

SpringBoot单体服务无感更新启动,动态检测端口号并动态更新
SpringBoot单体服务无感更新启动 package com.basaltic.warn;import cn.hutool.core.io.IoUtil; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplic…...

CSS基础知识04
文本溢出通常是指在限定的空间内不能容纳所输入的文字,导致文字超出了容器的边界 一、文本溢出 1.1.css属性处理 所用到的属性 属性属性值overflowvisible:默认值,内容不会被修剪,会呈现在元素框之外。hidden:内容会…...

python程序对服务器cpu和内存资源占用的管理。
背景 在服务器上部署了一套目标检测的程序,做成while true 的轮询检测数据更新的定时任务。 结果没想到那台服务器还有一套可视化程序要给领导演示看,结果演示的时候平台各种报错。 然后通过top查看了一下资源利用率发现python的程序cpu 130。…...

java算法性能调优:详尽探讨时间复杂度与空间复杂度的分析与优化“
接下来我将带领大家进入Java数据结构的深入学习,让我们一同享受Java数据结构中的奥秘。 一、引言 二、时间复杂度 三、空间复杂度 四、Java中的时间复杂度和空间复杂度 五、优化时间复杂度和空间复杂度 七、时间复杂度和空间复杂度的重要性 一:时间…...

人工智能:塑造未来的工作与生活
目录 人工智能技术的应用前景与影响 人工智能的历史与现状 人工智能的应用领域 人工智能的前景与挑战 个人视角:人工智能的应用前景与未来 人工智能在生活中的潜力 面对人工智能带来的挑战 我的观点与建议 结语 人工智能技术的应用前景与影响 随着人工智能…...

RK3568笔记六十九: 事件回调处理之Libevent 简单使用
若该文为原创文章,转载请注明原文出处。 一、前言 在项目开发过程中,事件处理使用相当多,特别是在UI处理的过程中,UI不能在非UI程里直接操作,否则会出现内存等异常,即不能在子线程里操作UI,所以用事件消息的方式通知UI线程刷新UI界面,在这一细节上掉了好多次坑。 Lib…...

MySQL如何解决幻读?
目录 一、什么是幻读? 1.1 幻读的定义 1.2 幻读的示例 1.3 幻读产生的原因? 1.4 读已提交(Read Committed) 1.4.1 确定事务等级 1.4.2 非锁定读取 准备 示例 结论 1.4.3 锁定读取 准备 示例 分析 结论 1.5 可重复读…...

Javascript_设计模式(二)
什么是迭代器模式?一般用在什么场景? 迭代器模式是一种行为型设计模式,它用于提供一种顺序访问聚合对象中各个元素的方法,而又不暴露该对象的内部表示。通过使用迭代器模式,可以遍历一个聚合对象,而无需关心该对象的内部结构和…...

时间同步服务器
1、时间同步服务:在多台主机协作时,确保时间同步,防止时间不一致造成的故障。 2、时间按同步实现: ntp 、chrony 3、命令:timedatectl timedatectl set-time "2024-02-13 10:41:55" timedatect…...

react+hook+vite项目使用eletron打包成桌面应用+可以热更新
使用Hooks-Admin的架构 Hooks-Admin: 🚀🚀🚀 Hooks Admin,基于 React18、React-Router V6、React-Hooks、Redux、TypeScript、Vite2、Ant-Design 开源的一套后台管理框架。https://gitee.com/HalseySpicy/Hooks-Adminexe桌面应用…...

STM32 ADC --- DMA乒乓缓存
STM32 ADC — DMA乒乓缓存 文章目录 STM32 ADC --- DMA乒乓缓存软件切换实现乒乓利用DMA双缓冲实现乒乓 通过cubeMX配置生成HAL工程这里使用的是上篇文章(STM32 ADC — DMA采样)中生成的工程配置 软件切换实现乒乓 cubeMX默认生成的工程中是打开DMA中断…...

SpringCloud基础 入门级 学习SpringCloud 超详细(简单通俗易懂)
Spring Cloud 基础入门级学习 超详细(简单通俗易懂) 一、SpringCloud核心组件第一代:SpringCloud Netflix组件第二代:SpringCloud Alibaba组件SpringCloud原生组件 二、SpringCloud体系架构图三、理解分布式与集群分布式集群 四、…...

【Windows 常用工具系列 20 -- MobaXterm 登录 WSL】
文章目录 MobaXterm 登录 WSL MobaXterm 登录 WSL 在 WSL 启动之后,打开 MobaXterm: 在 Distribution 中选择自己本地安装的 ubuntu 版本,我这里使用的是ubuntu-20.4,然后在 runmethod 中选择 Localhost connection. 连接成功之…...

【vmware+ubuntu16.04】ROS学习_博物馆仿真克隆ROS-Academy-for-Beginners软件包处理依赖报错问题
首先安装git 进入终端,输入sudo apt-get install git 安装后,创建一个工作空间名为tutorial_ws, 输入 mkdir tutorial_ws#创建工作空间 cd tutorial_ws#进入 mkdir src cd src git clone https://github.com/DroidAITech/ROS-Academy-for-Be…...

UniApp的Vue3版本中H5配置代理的最佳方法
UniApp的Vue3版本中H5项目在本地开发时需要配置跨域请求调试 最开始在 manifest.json中配置 总是报404,无法通过代理请求远程的接口并返回404错误。 经过验证在项目根目录创建 vite.config.js文件 vite.config.js内容: // vite.config.js import {defineConfig }…...

深入了解Pod
Pod是Kubernetes中最小的单元,它由一组、一个或多个容器组成,每个Pod还包含了一个Pause容器,Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC等。 1、Pod 是由一组紧耦合的容器组成的容器组,当然…...

基于Spider异步爬虫框架+JS动态参数逆向+隧道代理+自定义中间件的猎聘招聘数据爬取
在本篇博客中,我们将介绍如何使用 Scrapy 框架结合 JS 逆向技术、代理服务器和自定义中间件,来爬取猎聘网站的招聘数据。猎聘是一个国内知名的招聘平台,提供了大量的企业招聘信息和职位信息。本项目的目标是抓取指定城市的招聘信息࿰…...

Spring 中的 BeanDefinitionParserDelegate 和 NamespaceHandler
一、BeanDefinitionParserDelegate Spring在解析xml文件的时候,在遇到<bean>标签的时候,我们会使用BeanDefinitionParserDelegate对象类解析<bean>标签的内容,包括<bean>标签的多个属性,例如 id name class in…...

BERT模型核心组件详解及其实现
摘要 BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练模型,在自然语言处理领域取得了显著的成果。本文详细介绍了BERT模型中的几个关键组件及其实现,包括激活函数、变量初始化…...

图论-代码随想录刷题记录[JAVA]
文章目录 前言深度优先搜索理论基础所有可达路径岛屿数量岛屿最大面积孤岛的总面积沉默孤岛Floyd 算法dijkstra(朴素版)最小生成树之primkruskal算法 前言 新手小白记录第一次刷代码随想录 1.自用 抽取精简的解题思路 方便复盘 2.代码尽量多加注释 3.记录…...

c#加载shellcode
本地加载bin文件 SharpPELoader项目如下: using System; using System.IO; using System.Runtime.InteropServices;namespace TestShellCode {internal class Program{private const uint MEM_COMMIT 0x1000;private const uint PAGE_EXECUTE_READWRITE 0x40;pr…...

HarmonyOS 开发环境搭建
HarmonyOS(鸿蒙操作系统)作为一种面向全场景多设备的智能操作系统,正逐渐在市场上崭露头角。为了进入HarmonyOS生态,开发者需要搭建一个高效的开发环境。本文将详细介绍如何搭建HarmonyOS开发环境,特别是如何安装和配置…...

【网络云计算】2024第46周周考-磁盘管理的基础知识-RAID篇
文章目录 1、画出各个RAID的结构图,6句话说明优点和缺点,以及磁盘可用率和坏盘数量,磁盘总的数量2、写出TCP五层模型以及对应的常用协议 【网络云计算】2024第46周周考-磁盘管理的基础知识-RAID篇 1、画出各个RAID的结构图,6句话说…...

深入理解 SQL_MODE 之 ANSI_QUOTES
引言 在 MySQL 数据库中,sql_mode 是一个重要的配置参数,它定义了 MySQL 应该遵循的 SQL 语法标准以及数据验证规则。其中,ANSI_QUOTES 是 sql_mode 中的一个重要选项,它改变了 MySQL 对于字符串和标识符的识别方式,使…...

容器技术在持续集成与持续交付中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 容器技术在持续集成与持续交付中的应用 容器技术在持续集成与持续交付中的应用 容器技术在持续集成与持续交付中的应用 引言 容器…...

【嵌入式软件-STM32】OLED显示屏+调试方法
目录 一、调试方式 1)串口调试 优势 弊端 2)显示屏调试 优势 弊端 3)Keil调试模式 4)点灯调试法 5)注释调试法 6)对照法 二、OLED简介 OLED组件 OLED显示屏 0.96寸OLED模块 OLED外观和种类…...

kubernetes简单入门实战
本章将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其访问 Namespace Namespace是k8s系统中一个非常重要的资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下,k8s集群中的所有的Pod都是可以相…...

Python连接Mysql、Postgre、ClickHouse、Redis常用库及封装方法
博主在这里分享一些常见的python连接数据库或中间件的库和封装方案,希望对大家有用。 Mysql封装 #!/usr/bin/python # -*- coding: utf-8 -*- import sys import pymysql from settings import MYSQL_DB, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, EN…...

如何修改npm包
前言 开发中遇到一个问题,配置 Element Plus 自定义主题时,添加了 ElementPlusResolver({ importStyle: "sass" }) 后,控制台出现报错,这是因为 Dart Sass 2.0 不再支持使用 !global 来声明新变量,虽然当前…...