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

宽字节注入

尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范。但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如gbk,作为自己默认的编码类型。也有一些cms为了考虑老用户,所以出了gbk和utf-8两个版本。

我们就以gbk字符编码为示范,拉开帷幕。gbk是一种多字符编码,具体定义自行百度。但有一个地方尤其要注意:

通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。在php中,我们可以通过输出

echo strlen("和");

来测试。当将页面编码保存为gbk时输出2,utf-8时输出3。

除了gbk以外,所有ANSI编码都是2个字节。ansi只是一个标准,在不用的电脑上它代表的编码可能不相同,比如简体中文系统中ANSI就代表是GBK。

以上是一点关于多字节编码的小知识,只有我们足够了解它的组成及特性以后,才能更好地去分析它身上存在的问题。

说了这么多废话,现在来研究一下在SQL注入中,字符编码带来的各种问题。

0×01 MYSQL中的宽字符注入

这是一个老话题了,也被人玩过无数遍。但作为我们这篇文章的序幕,也是基础,是必须要提的。

我们先搭建一个实验环境。暂且称之为phithon内容管理系统v1.0,首先先新建一个数据库,把如下压缩包中的sql文件导入:

测试代码及数据库:百度网盘 请输入提取码 提取密码:75tu

之后的phithon内容管理系统会逐步完善,但会一直使用这个数据表。

源码很简单(注意先关闭自己php环境的magic_quotes_gpc):

 

01 <?php 02 //连接数据库部分,注意使用了gbk编码,把数据库信息填写进去 03 $conn = mysql_connect('localhost', 'root', 'toor!@#$') or die('bad!'); 04 mysql_query("SET NAMES 'gbk'"); 05 mysql_select_db('test', $conn) OR emMsg("连接数据库失败,未找到您填写的数据库"); 06 //执行sql语句 07 $id = isset($_GET['id']) ? addslashes($_GET['id']) : 1; 08 $sql = "SELECT * FROM news WHERE tid='{$id}'"; 09 $result = mysql_query($sql, $conn) or die(mysql_error()); //sql出错会报错,方便观察 10 ?> 11 <!DOCTYPE html> 12 <html> 13 <head> 14 <meta charset="gbk" /> 15 <title>新闻</title> 16 </head> 17 <body> 18 <?php 19 $row = mysql_fetch_array($result, MYSQL_ASSOC); 20 echo "<h2>{$row['title']}</h2><p>{$row['content']}<p>\n"; 21 mysql_free_result($result); 22 ?> 23 </body> 24 </html>

SQL语句是SELECT * FROM news WHERE tid='{$id}',就是根据文章的id把文章从news表中取出来。

在这个sql语句前面,我们使用了一个addslashes函数,将$id的值转义。这是通常cms中对sql注入进行的操作,只要我们的输入参数在单引号中,就逃逸不出单引号的限制,无法注入,如下图:

那么怎么逃过addslashes的限制?众所周知addslashes函数产生的效果就是,让’变成\’,让引号变得不再是“单引号”,只是一撇而已。一般绕过方式就是,想办法处理\’前面的\:

 

1.想办法给\前面再加一个\(或单数个即可),变成\\’,这样\被转义了,’逃出了限制 2.想办法把\弄没有。

我们这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)。如果我们输入%df’看会怎样:

我们可以看到,已经报错了。我们看到报错,说明sql语句出错,看到出错说明可以注入了。

为什么从刚才到现在,只是在’也就是%27前面加了一个%df就报错了?而且从图中可以看到,报错的原因就是多了一个单引号,而单引号前面的反斜杠不见了。

这就是mysql的特性,因为gbk是多字节编码,他认为两个字节代表一个汉字,所以%df和后面的\也就是%5c变成了一个汉字“運”,而’逃逸了出来。

因为两个字节代表一个汉字,所以我们可以试试“%df%df%27”:

不报错了。因为%df%df是一个汉字,%5c%27不是汉字,仍然是\’。

那么mysql怎么判断一个字符是不是汉字,根据gbk编码,第一个字节ascii码大于128,基本上就可以了。比如我们不用%df,用%a1也可以:

%a1%5c他可能不是汉字,但一定会被mysql认为是一个宽字符,就能够让后面的%27逃逸了出来。

于是我可以构造一个exp出来,查询管理员账号密码:

0×02 GB2312与GBK的不同

曾经有一个问题一直困扰我很久。

gb2312和gbk应该都是宽字节家族的一员。但我们来做个小实验。把phithon内容管理系统中set names修改成gb2312:

 结果就是不能注入了:

有些同学不信的话,也可以把数据库编码也改成gb2312,也是不成功的。

为什么,这归结于gb2312编码的取值范围。它的高位范围是0xA1~0xF7,低位范围是0xA1~0xFE,而\是0x5c,是不在低位范围中的。所以,0x5c根本不是gb2312中的编码,所以自然也是不会被吃掉的。

所以,把这个思路扩展到世界上所有多字节编码,我们可以这样认为:只要低位的范围中含有0x5c的编码,就可以进行宽字符注入。

0×03 mysql_real_escape_string解决问题?

部分cms对宽字节注入有所了解,于是寻求解决方案。在php文档中,大家会发现一个函数,mysql_real_escape_string,文档里说了,考虑到连接的当前字符集。

于是,有的cms就把addslashes替换成mysql_real_escape_string,来抵御宽字符注入。我们继续做试验,phithon内容管理系统v1.2:,就用mysql_real_escape_string来过滤输入:

 我们来试试能不能注入:

一样没压力注入。为什么,明明我用了mysql_real_escape_string,但却仍然不能抵御宽字符注入。

原因就是,你没有指定php连接mysql的字符集。我们需要在执行sql语句之前调用一下mysql_set_charset函数,设置当前连接的字符集为gbk。

就可以避免这个问题了:

0×04 宽字符注入的修复

在3中我们说到了一种修复方法,就是先调用mysql_set_charset函数设置连接所使用的字符集为gbk,再调用mysql_real_escape_string来过滤用户输入。

这个方式是可行的,但有部分老的cms,在多处使用addslashes来过滤字符串,我们不可能去一个一个把addslashes都修改成mysql_real_escape_string。我们第二个解决方案就是,将character_set_client设置为binary(二进制)。

只需在所有sql语句前指定一下连接的形式是二进制:

mysql_query("SET character_set_connection=gbk, character_set_results=gbk,character_set_client=binary", $conn); 

这几个变量是什么意思?

当我们的mysql接受到客户端的数据后,会认为他的编码是character_set_client,然后会将之将换成character_set_connection的编码,然后进入具体表和字段后,再转换成字段对应的编码。

然后,当查询结果产生后,会从表和字段的编码,转换成character_set_results编码,返回给客户端。

所以,我们将character_set_client设置成binary,就不存在宽字节或多字节的问题了,所有数据以二进制的形式传递,就能有效避免宽字符注入。

比如,我们的phithon内容管理系统v2.0版本更新如下:

已经不能够注入了:

在我审计过的代码中,大部分cms是以这样的方式来避免宽字符注入的。这个方法可以说是有效的,但如果开发者画蛇添足地增加一些东西,会让之前的努力前功尽弃。

1|10×05 iconv导致的致命后果

很多cms,不止一个,我就不提名字了,他们的gbk版本都存在因为字符编码造成的注入。但有的同学说,自己测试了这些cms的宽字符注入,没有效果呢,难道是自己姿势不对?

当然不是。实际上,这一章说的已经不再是宽字符注入了,因为问题并不是出在mysql上,而是出在php中了。

很多cms(真的很多哦,不信大家自己网上找找)会将接收到数据,调用这样一个函数,转换其编码:

iconv(‘utf-8’, ‘gbk’, $_GET[‘word’]);

目的一般是为了避免乱码,特别是在搜索框的位置。

比如我们的phithon内容管理系统v3.0

我们可以看到,它在sql语句执行前,将character_set_client设置成了binary,所以可以避免宽字符注入的问题。但之后其调用了iconv将已经过滤过的参数$id给转换了一下。

那我们来试试此时能不能注入:

居然报错了。说明可以注入。而我只是输入了一个“ 錦‘ ”。这是什么原因?

我们来分析一下。“錦”这个字,它的utf-8编码是0xe98ca6,它的gbk编码是0xe55c。

 

有的同学可能就领悟了。\的ascii码正是5c。那么,当我们的錦被iconv从utf-8转换成gbk后,变成了%e5%5c,而后面的’被addslashes变成了%5c%27,这样组合起来就是%e5%5c%5c%27,两个%5c就是\\,正好把反斜杠转义了,导致’逃逸出单引号,产生注入。

这正利用了我之前说的,绕过addslashes的两种方式的第一种:将\转义掉。

那么,如果我是用iconv将gbk转换成utf-8呢?

 我们来试试:

 果然又成功了。这次直接用宽字符注入的姿势来的,但实际上问题出在php而不是mysql。我们知道一个gbk汉字2字节,utf-8汉字3字节,如果我们把gbk转换成utf-8,则php会每两个字节一转换。所以,如果\’前面的字符是奇数的话,势必会吞掉\,’逃出限制。

那么为什么之前utf-8转换成gbk的时候,没有使用这个姿势?

这跟utf-8的规则有关,UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

从2我们可以看到,对于多字节的符号,其第2、3、4字节的前两位都是10,也就是说,\(0x0000005c)不会出现在utf-8编码中,所以utf-8转换成gbk时,如果有\则php会报错:

但因为gbk编码中包含了\,所以仍然可以利用,只是利用方式不同罢了。

    总而言之,在我们处理了mysql的宽字符注入以后,也别认为就可以高枕无忧了。调用iconv时千万要小心,避免出现不必要的麻烦。 

0×06 总结

在逐渐国际化的今天,推行utf-8编码是大趋势。如果就安全性来说的话,我也觉得使用utf-8编码能够避免很多多字节造成的问题。

不光是gbk,我只是习惯性地把gbk作为一个典型的例子在文中与大家说明。世界上的多字节编码有很多,特别是韩国、日本及一些非英语国家的cms,都可能存在由字符编码造成的安全问题,大家应该有扩展性的思维。

总结一下全文中提到的由字符编码引发的安全问题及其解决方案:

 

1.gbk编码造成的宽字符注入问题,解决方法是设置character_set_client=binary。 2.矫正人们对于mysql_real_escape_string的误解,单独调用set name=gbk和mysql_real_escape_string是无法避免宽字符注入问题的。还得调用mysql_set_charset来设置一下字符集。 3.谨慎使用iconv来转换字符串编码,很容易出现问题。只要我们把前端html/js/css所有编码设置成gbk,mysql/php编码设置成gbk,就不会出现乱码问题。不用画蛇添足地去调用iconv转换编码,造成不必要的麻烦。

这篇文章是我对于自己白盒审计经验的一点小总结,但自己确实在很多方面存在欠缺,文中所提到的姿势难免存在纰漏和错误,希望有相同爱好的同学能与我指出,共同进步。

这篇文章不像上篇xss的,能够举出很多0day实例来论证宽字符造成的危害。原因有二:

1.宽字符问题确实不如富文本xss那么普遍,gbk编码的cms所占的比例也比较小,怪我才疏学浅,并不能每一章都找到相应的实例。

‍‍2.注入的危害比xss大得多,如果作为0day发出来,影响很坏。但我确实在写文章以及以前的审计过程中找到不少cms存在的编码问题。

相关文章:

宽字节注入

尽管现在呼吁所有的程序都使用unicode编码&#xff0c;所有的网站都使用utf-8编码&#xff0c;来一个统一的国际规范。但仍然有很多&#xff0c;包括国内及国外&#xff08;特别是非英语国家&#xff09;的一些cms&#xff0c;仍然使用着自己国家的一套编码&#xff0c;比如gbk…...

H5 scss 移动端的样式适配

在移动端样式的scss文件中&#xff0c;出现了这些变量 env() 与 constant() 设置安全区域&#xff0c;是css里IOS11新增的属性&#xff0c;webkit的css函数&#xff0c;用于设定安全区域与边界的距离&#xff0c;有4个预定义变量&#xff1a; safe-area-inset-left: 安全区域距…...

240004基于Jamva+ssm+maven+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…...

Word2Vec 模型 PyTorch 实现并复现论文中的数据集

详细注解链接&#xff1a;https://www.orzzz.net/directory/codes/Word2Vec/index.html 欢迎咨询&#xff01;...

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一) 你好&#xff0c;我是拉依达。 感谢所有阅读关注我的同学支持&#xff0c;目前博客累计阅读 27w&#xff0c;关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析&#xff08;持续更新&#xff09;-CSDN博客》已经是 Lin…...

使用matlab对矩阵进行分块

1. 前言 由于matlab内存限制&#xff0c;导致无法处理较大尺寸的矩阵&#xff1b; 2. 解决思路 读取原始大尺寸矩阵&#xff0c;分块后处理&#xff0c;及时删除中间过程文件&#xff0c;只保留分块处理后的最终结果&#xff0c;最后合并结果文件&#xff0c;减少内存占用。 …...

MongoDB(上)

MongoDB 基础 MongoDB 是什么&#xff1f; MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统&#xff0c;由 C 编写的。MongoDB 提供了 面向文档 的存储方式&#xff0c;操作起来比较简单和容易&#xff0c;支持“无模式”的数据建模&#xff0c;可以存储比较复杂…...

超详细的pycharm+anaconda搭建python虚拟环境

&#xff08;一&#xff09;pycharm安装 1. 下载 &#xff08;1&#xff09;从官网下载 &#xff0c;一般来说选择社区版就够用了。我这里选择2024.1.6的windows版本Other Versions - PyCharmGet past releases and previous versions of PyCharm.https://www.jetbrains.com/…...

yarn修改缓存位置

查看缓存位置 以下三个命令分别为&#xff1a;bin是yarn存储命令的二进制文件&#xff0c;global存储全局node_modules &#xff0c;cache存储用下下载缓存&#xff0c;查看本机目前的目录&#xff1a; 查看bin目录命令&#xff1a;yarn global bin 查看global目录命令&…...

单元测试知识总结

我们希望每段代码都是自测试的&#xff0c;每次改动之后&#xff0c;都能自动发现对现有功能的影响。 1 测试要求 在对软件单元进行动态测试之前&#xff0c;应对软件单元的源代码进行静态测试&#xff1b; 应建立测试软件单元的环境&#xff0c;如数据准备、桩模块、模拟器…...

光谱相机

光谱相机是一种能够同时获取目标物体的空间图像信息和光谱信息的成像设备。 1、工作原理 光谱相机通过光学系统将目标物体的光聚焦到探测器上&#xff0c;在探测器前设置分光元件&#xff0c;如光栅、棱镜或滤光片等&#xff0c;将光按不同波长分解成多个光谱通道&#xff0c…...

账号下的用户列表表格分析

好的&#xff0c;这是您提供的 el-table 组件中所有列的字段信息&#xff0c;以表格形式展示&#xff1a; 列标题 (label)字段属性 (prop)对齐方式 (align)宽度 (width)是否可排序 (sortable)说明IDidcenter100否管理员的唯一标识符头像avatarcenter90否管理员的头像 URL 或路…...

软件开发中 Bug 为什么不能彻底消除

在软件开发中&#xff0c;Bug无法彻底消除的原因主要包括&#xff1a;软件复杂度高、人员认知与沟通受限、需求和环境不断变化、工具与测试覆盖不足、经济与时间成本制约。其中“需求和环境不断变化”尤为关键&#xff0c;因为在实际开发中&#xff0c;业务逻辑随着市场与用户反…...

Flutter 中的 Flexible 与 Expanded 的介绍、区别与使用

在 Flutter 中&#xff0c;布局是构建用户界面的重要部分。Flexible 和 Expanded 是两个常用的布局小部件&#xff0c;它们都用于控制子小部件在父容器中的空间分配。虽然它们有相似之处&#xff0c;但在使用上有一些关键的区别。本文将介绍这两个小部件的基本概念、区别、参数…...

从零开始学习 sg200x 多核开发之 sophpi 编译生成 fip.bin 流程梳理

本文主要介绍 sophpi 编译生成 fip.bin 流程。 1、编译前准备 sophpi 的基本编译流程如下&#xff1a; $ source build/cvisetup.sh $ defconfig sg2002_wevb_riscv64_sd $ clean_all $ build_all $ pack_burn_image注&#xff1a; 需要在 bash 下运行clean_all 非必要可以不…...

通过一个例子学习回溯算法:从方法论到实际应用

回溯算法&#xff1a;从方法论到实际应用 回溯算法&#xff08;Backtracking&#xff09;是一种通过穷举法寻找问题所有解的算法&#xff0c;它的核心思想是逐步构建解空间树&#xff0c;在每个步骤中判断当前解是否合法。如果不合法&#xff0c;就“回溯”到上一步&#xff0…...

google 的guava 学习 基本工具类

Guava 是 Google 开发的一个 Java 核心库&#xff0c;它提供了一系列工具类&#xff0c;用于简化 Java 编程中的常见任务。以下是 Preconditions 和 Verify 两个工具类的使用示例&#xff1a; Preconditions 类 Preconditions 类提供了一组静态方法&#xff0c;用于在代码中插…...

【Linux金典面试题(上)】41道Linux金典面试问题+详细解答,包含基本操作、系统维护、网络配置、脚本编程等问题。

大家好&#xff0c;我是摇光~&#xff0c;用大白话讲解所有你难懂的知识点 之前写了一篇关于 python 的面试题&#xff0c;感觉大家都很需要&#xff0c;所以打算出一个面试专栏。 【数据分析岗】Python金典面试题 这个专栏主要针对面试大数据岗位、数据分析岗位、数据运维等…...

SpringBoot【九】mybatis-plus之自定义sql零基础教学!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE mybatis-plus的基本使用&#xff0c;前两期基本讲的差不多&#xff0c;够日常使用&#xff0c;但是有的小伙伴可能就会抱怨了&#xff0c;若是遇到业务逻辑比较复杂的sq…...

CTF 攻防世界 Web: FlatScience write-up

题目名称-FlatScience 网址 index 目录中没有发现提示信息&#xff0c;链接会跳转到论文。 目前没有发现有用信息&#xff0c;尝试目录扫描。 目录扫描 注意到存在 robots.txt 和 login.php。 访问 robots.txt 这里表明还存在 admin.php admin.php 分析 在这里尝试一些 sql…...

【记录49】vue2 vue-office在线预览 docx、pdf、excel文档

vue2 在线预览 docx、pdf、excel文档 docx npm install vue-office/docx vue-demi0.14.6 指定版本 npm install vue-office/docx vue-demi <template><VueOfficeDocx :src"pdf" style"height: 100vh;" rendere"rendereHandler" error&…...

机器学习中的 Transformer 简介(第 1 部分)

目录 一、说明 二、为什么是 Transformer&#xff1f; 三、什么是 Transformer&#xff1f; 3.1 译者的类比 四、编码器部分 4.1 、从文本输入到输入嵌入 4.2 词嵌入 4.2 N倍编码器段 4.4 多头注意力机制 4.5 添加残差和层归一化 4.6 添加残差和层归一化 五、总结 一、说明 西如…...

宝塔-docker拉取宝塔镜像,并运行宝塔镜像

宝塔-拉取宝塔镜像&#xff0c;并运行镜像 第1步&#xff1a;查询 docker search btpanel/baota此docker镜像由堡塔安全官方发布&#xff0c;镜像版本为宝塔面板9.2.0正式版和9.0.0_lts 稳定版&#xff0c;镜像会随着宝塔面板更新。 目前支持x86_64和arm架构可供下载使用 版本…...

【从零开始入门unity游戏开发之——C#篇12】新的引用类型——数组array

文章目录 一、数组&#xff08;array&#xff09;&#xff08;一维数组&#xff09;1、声明数组2、初始化数组3、访问数组元素4 、修改数组元素5、获取数组的长度6、遍历数组使用 for 循环&#xff1a;使用 foreach 循环&#xff1a; 7、数组方法排序&#xff1a;逆序&#xff…...

人工智能在数字人的技术与应用

在人工智能领域&#xff0c;数字人技术正逐渐从科幻小说走向现实。数字人&#xff0c;也称为虚拟助手或虚拟形象&#xff0c;是通过AI技术模拟人类行为、语言和情感的数字化存在。本文将深入探讨数字人技术的核心原理、最新进展以及在不同领域的应用案例&#xff0c;为专业人士…...

【机器人】Graspness 端到端 抓取点估计 | 论文解读

在复杂场景中实现抓取检测&#xff0c;Graspness是一种端到端的方法&#xff1b; 输入点云数据&#xff0c;输出抓取角度、抓取深度、夹具宽度等信息。 开源地址&#xff1a;GitHub - rhett-chen/graspness_implementation: My implementation of Graspnet Graspness. 论文地…...

服务器Docker OOM RSS高问题排查思路

优质博文&#xff1a;IT-BLOG-CN 防走弯路为防止走弯路&#xff0c;强烈建议先仔细阅读以下加粗内容&#xff1a; 如果你的应用是因为公司最近降成本调小实例物理内存才出现docker oom&#xff0c;而之前从来没有出现过&#xff0c;那么大概率是堆内存太大导致&#xff0c;这种…...

动态导出word文件支持转pdf

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、功能说明二、使用步骤1.controller2.工具类 DocumentUtil 导出样式 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff…...

【文档搜索引擎】在内存中构造出索引结构(下)

文章目录 4.保存到磁盘中为什么要保存在磁盘中怎么保存操作步骤1. 前期准备2. 主要操作 5. 将磁盘中的数据加载到内存中Parser 类完整源码Index 类完整源码 4.保存到磁盘中 为什么要保存在磁盘中 索引本来是存储在内存中的&#xff0c;为什么要将其保存在硬盘中&#xff1f; …...

旅游资源系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...

如何用细节提升用户体验?

前端给用户反馈是提升用户体验的重要部分&#xff0c;根据场景选择不同的方式可以有效地提升产品的易用性和用户满意度。以下是常见的方法&#xff1a; 1. 视觉反馈 用户执行了某些操作后&#xff0c;需要即时确认操作结果。例如&#xff1a;按钮点击、数据提交、页面加载等。…...

容器设计模式:Sidecar

文章目录 容器设计模式&#xff1a;Sidecar 模式1. 什么是 Sidecar 模式&#xff1f;2. Sidecar 模式的原理2.1 工作机制2.2 常见用途 3. Sidecar 模式示例示例&#xff1a;日志收集 4. Sidecar 模式的架构图图例&#xff1a; 5. Sidecar 模式的优点6. Sidecar 模式的局限性7. …...

深入剖析MyBatis的架构原理

架构设计 简要画出 MyBatis 的架构图 >> ​​ Mybatis 的功能架构分为哪三层&#xff1f; API 接口层 提供给外部使用的接口 API&#xff0c;开发人员通过这些本地 API 来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。MyBatis 和数据库的…...

深入C语言文件操作:从库函数到系统调用

引言 文件操作是编程中不可或缺的一部分&#xff0c;尤其在C语言中&#xff0c;文件操作不仅是处理数据的基本手段&#xff0c;也是连接程序与外部世界的重要桥梁。C语言提供了丰富的库函数来处理文件&#xff0c;如 fopen、fclose、fread、fwrite 等。然而&#xff0c;这些库…...

【Linux】shell脚本二

2、接收用户的参数 shell脚本已经内设了用于接收用户输入参数的变量&#xff0c;变量之间可以使用空格隔开。 如&#xff1a;./test.sh one two three four $0&#xff1a;对应的是当前shell脚本程序的名称&#xff0c;即test.sh$#&#xff1a;对应的是总共有几个参数&#…...

从万维网到人工智能:改变生活的11项技术里程碑

1984 年 1 月 24 日&#xff0c;苹果公司推出了 Macintosh 128K&#xff0c;从此永远改变了个人电脑的面貌。 史蒂夫・乔布斯&#xff08;Steve Jobs&#xff09;这款小巧且用户友好的电脑向全世界引入了图形用户界面&#xff0c;标志着个人技术发展历程中的一个关键时刻。 从…...

Hyperledger Fabric 2.x 环境搭建

Hyperledger Fabric 是一个开源的企业级许可分布式账本技术&#xff08;Distributed Ledger Technology&#xff0c;DLT&#xff09;平台&#xff0c;专为在企业环境中使用而设计&#xff0c;与其他流行的分布式账本或区块链平台相比&#xff0c;它有一些主要的区别。 环境准备…...

【Maven】自定义Maven插件

场景&#xff1a; 1、自定义一个插件目标 timer&#xff0c;用于显示当前日期时间。 2、将 timer 绑定到 validate 阶段。 调研 1、maven-clean-plugin 下载 maven-clean-plugin 插件的源码&#xff0c;在本地使用 IDEA 打开 可以看到&#xff0c;maven-clean-plugin 插件是…...

修改vscode中emmet中jsx和tsx语法中className的扩展符号从单引号到双引号 - HTML代码补全 - 单引号双引号

效果图 实现步骤 文件 > 首选项 > 设置搜索“”在settings.json中修改&#xff0c;增加 "emmet.syntaxProfiles": {"html": {"attr_quotes": "single"},"jsx": {"attr_quotes": "double","…...

数据结构day3作业

一、完整功能【顺序表】的创建 【seqList.h】 #ifndef __SEQLIST_H__ #define __SEQLIST_H__#include <stdio.h> #include <string.h> #include <stdlib.h>//宏定义&#xff0c;线性表的最大容量 #define MAX 30//类型重定义&#xff0c;表示要存放数据的类…...

pydub AudioSegment实现音频重采样 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…...

C++多线程常用方法

在 C 中&#xff0c;线程相关功能主要通过头文件提供的类和函数来实现&#xff0c;以下是一些常用的线程接口方法和使用技巧&#xff1a; std::thread类 构造函数&#xff1a; 可以通过传入可调用对象&#xff08;如函数指针、函数对象、lambda 表达式等&#xff09;来创建一…...

【网络安全】Web Timing 和竞争条件攻击:揭开隐藏的攻击面

Web Timing 和竞争条件攻击&#xff1a;揭开隐藏的攻击面 在传统的 Web 应用中&#xff0c;漏洞的发现和利用通常相对容易理解。如果代码存在问题&#xff0c;我们可以通过发送特定输入来强制 Web 应用执行非预期的操作。这种情况下&#xff0c;输入和输出之间往往有直接关系&…...

12月最新编程语言排行榜

“岁末将至&#xff0c;2024年的编程世界又发生了哪些变化&#xff1f;是Python依然稳坐王座&#xff0c;还是有新语言杀出重围&#xff1f;让我们一起看看12月最新编程语言排行榜&#xff0c;寻找未来技术的风向标。” 今年&#xff0c;哪些编程语言成为行业焦点&#xff1f;…...

迭代器模式

迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为设计模式&#xff0c;它提供了一种方法来访问一个聚合对象中的各个元素&#xff0c;而又不暴露其内部的表示。这种模式允许你逐个访问对象中的元素&#xff0c;而无需知道其底层的数据结构。迭代器模…...

探秘 WB 实验:AI 助力攻克操作难关

在生物学研究的浩瀚领域中&#xff0c;WB 实验犹如一座关键的灯塔&#xff0c;照亮了我们探索蛋白质世界的道路。今天&#xff0c;就让我们一同深入了解 WB 实验的全貌&#xff0c;以及 AI 如何在其中发挥神奇作用&#xff0c;帮助我们应对实际操作中的重重挑战。 WB 实验&…...

labelimg使用指南

YOLOv8目标检测(一)_检测流程梳理&#xff1a;YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集&#xff1a;YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型&#xff1a;YOLOv8目标检测(三)_训…...

车载终端_智能车载终端定制_农机/出租车/叉车/驾培车载终端MTK方案

车载终端集成了先进的技术和卓越的性能&#xff0c;采用了联发科的高效低功耗ARM处理器&#xff0c;具备八核架构&#xff0c;主频高达2.0GHz&#xff0c;基于12nm制程工艺&#xff0c;不仅性能强劲&#xff0c;而且功耗控制出色。基本配置为4GB内存与64GB存储&#xff0c;用户…...

Unity中Pico实现透视

1.参照Pico官方【透视 | PICO 开发者平台】文档设置。 2.额外的需要将主相机的post processing禁用。...

elk部署与实战案例

**ELK Stack** 是一个非常强大的日志处理和分析平台&#xff0c;由 **Elasticsearch**、**Logstash** 和 **Kibana** 三个组件组成。它被广泛应用于日志收集、搜索、分析和可视化。ELK 可以处理大量数据&#xff0c;并帮助用户从中提取有价值的信息。以下是一个从部署到实际应用…...