【Web实战】浅谈reactor netty httpclient请求解析过程

news2025/1/17 15:58:57

目录

0x00 前言

0x01 "畸形scheme"HTTP请求

0x02 其他


0x00 前言

Reactor Netty HttpClient 是 Reactor Netty 框架提供的一个用于进行异步 HTTP 请求的客户端库。它基于 Reactor 框架,采用响应式编程模型,允许以非阻塞的方式执行 HTTP 请求和处理响应。

image.png

通过引入对应的依赖,即可通过使用Reactor Netty从HttpClient获取目标的响应报文:

image.png

下面是一个具体的例子,首先创建了一个 HttpClient 对象,通过Reactor Netty 的链式调用 API 来构建我们的请求,发起了一个 GET 请求访问了target并打印对应响应的内容,完成了整个请求与响应处理过程:

HttpClient httpClient = HttpClient.create().wiretap(true);
httpClient.get().uri(target).responseContent().aggregate().asString().doOnSuccess(s -> {
    System.out.println("s1=" + s);
}).block();

上述代码串联了多个Reactor Netty的方法,下面是简单的说明:

  • httpClient.get().uri(target):通过httpClient创建了一个HTTP GET请求,并指定了请访问的目标URL。
  • .responseContent():调用.responseContent()方法,会获取到一个表示HTTP响应内容(响应体)的Flux\<ByteBuf>,其中Flux是Reactor中的一种反应式数据类型,表示异步流。异步处理响应体的数据信息。
  • .aggregate():因为HTTP响应的内容通常会被分成多个字节块,该方法用于将它们进行整合。
  • .asString():调用该方法将ByteBuf内容解码为字符串方便后续的处理。
  • doOnSuccess(s -> { System.out.println("s1=" + s);}):使用.doOnSuccess()方法注册一个回调函数,当HTTP响应成功完成时,执行这个函数将HTTP响应的内容打印到控制台中。
  • .block():阻塞当前线程以等待HTTP响应的完成。.block()方法会触发实际的HTTP请求发送和响应处理,然后等待直到HTTP请求完成,并且只有在响应成功时才会解除阻塞。

当然除了block以外,还可以通过类似subscribe获取响应报文。

0x01 "畸形scheme"HTTP请求

以GET请求为例,下面对reactor netty httpclient请求解析过程进行简单的分析:

在 Reactor Netty 框架中,MonoHttpConnect是一个用于表示 HTTP 连接的 Mono 类型。它代表了一个异步的 HTTP 请求,并返回一个 Mono 类型的结果。通过调用 subscribe 方法,可以触发实际的 HTTP 请求,并通过订阅者来处理响应结果:

image.png

首先这里会实例化HttpClientConnect,这里会调用uriEndpointFactory.createUriEndpoint创建 UriEndpoint,UriEndpoint是一个用于表示网络请求的目标地址的类。它封装了 URI 的相关信息,包括协议、主机名、端口号、路径等。reactor.netty.http.client.UriEndpointFactory#createUriEndpoint方法根据传入的参数,创建一个 UriEndpoint 对象,并返回该对象:

image.png

可以看到,在createUriEndpoint方法中,主要是通过正则匹配的方式获取URI 的相关信息:

image.png

创建完HttpClientHandler后,会通过配置对象(_config)来设置一些参数:

image.png

这里会调用resolverInternal方法用于获取地址解析器组。它负责将主机名解析为一个或多个 IP 地址,以便 HttpClient 可以与目标服务器建立连接:

image.png

实际调用的是其父类ClientTransportConfig的方法:

image.png

这里会create一系列的组件:

image.png

例如创建ConnectionProvider用来管理连接池,Builer这里硬编码传入对应的name为http,后续会创建一组连接并存储在连接池中。 当需要进行网络通信时,可以从连接池中获取一个连接并使用它来发送请求:

image.png

又例如PooledConnectionProvider,这个在后面会用到:

image.png

调用完后,此时会调用_config.httpConnectionProvider().acquire从 HTTP 连接提供者中获取一个可用的连接。以便进行 HTTP 请求:

image.png

查看具体的过程,这里最终会调用PooledConnectionProvider的acquire方法:

image.png

image.png

reactor.netty.resources.PooledConnectionProvider的作用是提供连接池管理功能。在使用 Reactor Netty 进行网络通信时,可以通过 PooledConnectionProvider 来管理和复用连接,以提高性能和资源利用率,这里会调用 acquire 方法获取一个可用的连接,以便进行网络通信。获取到的连接可以用于发送请求、接收响应等操作,如果连接池中没有可用的连接,它可能会创建一个新的连接:

image.png

从对应的调试信息可以知道,这里创建的是http client pool,结合前面解析请求target的过程,这里name的值并不是从请求target的schema获取的,是从前面Builer里硬编码获取的:

image.png

后面是HttpClientOperations的处理,也没有对schema进行相应检查操作,那么这里有没有可能reactor netty httpclient可以以任意符合正则匹配的schema进行请求呢?

image.png

验证下前面的猜想:

image.png

正常情况下,通过reactor netty httpclient请求http://127.0.0.1:8080/health正常返回:

image.png

将scheme替换成任意字符,可以发现依旧能正常请求并返回:

image.png

查看reactor netty httpclient的日志,确实没有考虑用户输入的协议,在PooledConnectionProvider创建了新的http client pool,同时也没有发现关于schema的检查:

image.png

image.png

结合前面请求target解析的正则:

image.png

image.png

scheme还支持下划线匹配,所以类似anyt____hing的schema同样能正常请求:

image.png

0x02 其他

WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具。 它的响应式编程的基于Reactor的。 WebClient中提供了标准Http请求方式对应的get、post、put、delete等方法,可以用来发起相应的请求。

通过引入如下依赖即可使用WebClient:

image.png

从依赖关系可以看到,实际上spring-boot-starter-webflux也是基于reactor-netty-http来发起相应的请求的:

image.png

下面的代码是一个简单的WebClient请求示例。可以通过WebClient.create()创建一个WebClient的实例,然后选择调用方式get,在uri()指定需要请求的路径,然后调用retrieve()发起请求并获得响应,bodyToMono(String.class)用来指定请求结果需要处理为String:

WebClient webClient = WebClient.builder().build();
String response = webClient.get().uri(url).retrieve().bodyToMono(String.class).block();
return response;

简单看下WebClient的处理过程,首先会在org.springframework.web.util.UriComponentsBuilder#fromUriString方法处理需要请求的目标:

image.png

可以看到这里也是通过正则的方式进行匹配:

image.png

若未匹配相关信息,会抛出throw new IllegalArgumentException("[" + uri + "] is not a valid URI");异常,否则进行进一步的封装,同时这里对scheme和host进行了一定的合法性检查:

image.png

但是并没有强制校验scheme是否是http/https,所以同样的当尝试请求anything://127.0.0.1:8080/health,WebClient同样也是能正常解析并正常返回:

image.png

可以看到结合reactor netty httpclient解析过程中的一些处理方式,可以构造类似上述任意协议的“畸形”的请求样式,在某种情况下可以绕过现有ssrf的一些安全防护措施。开发人员应该避免将不受信任且未经验证的数据从 HTTP 请求传递给reactor netty httpclient,避免不必要的绕过导致ssrf风险。

原文链接:https://forum.butian.net/share/2557

免费领取安全学习资料包!

渗透工具

技术文档、书籍

 

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

 

应急响应笔记

学习路线

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

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

相关文章

Audition 2024 24.0.0.46(音频剪辑)

Audition 2024是一款非常棒的音频编辑和混合软件&#xff0c;提供了广泛的工具和功能&#xff0c;用于创建、编辑、混合和设计音效。这款软件旨在加速音频和视频制作工作流程&#xff0c;提供具有原始音效的高质量混音。其界面构成清晰&#xff0c;操作简便&#xff0c;适合专业…

合并区间问题

以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;intervals [[1,…

七天.NET 8操作SQLite入门到实战 - 第三天SQLite快速入门

前言 今天我们花费一个小时快速了解SQLite数据类型、SQLite常用命令和语法。 七天.NET 8操作SQLite入门到实战详细教程 第一天 SQLite 简介第二天 在 Windows 上配置 SQLite环境 EasySQLite项目源码地址 GitHub地址&#xff1a;https://github.com/YSGStudyHards/EasySQLite&…

第2关:可变长整型数组类(成长版)

题目&#xff1a; 给出的头文件&#xff1a; #include <iostream> #include "array.h" using namespace std;int main() {Array a1;int n;cin >> n;for (int i 0;i ! n; i) {int t;cin >> t;a1.Push_back(t);}Array a2(a1);cout << "…

12 分布式锁加入看门狗

1、看门狗的流程图 2、看门狗的代码实现 /****类说明&#xff1a;Redis的key-value结构*/ public class LockItem {private final String key;private final String value;public LockItem(String key, String value) {this.key key;this.value value;}public String getKey…

opengl制作天空盒

首先创建顶点数组 unsigned int m_uiVaoBufferID; glGenVertexArrays(1, &m_uiVaoBufferID); 然后创建顶点缓冲区 float skyboxVertices[] {// positions-1.0f, 1.0f, -1.0f,-1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f,1.0f, 1.0f, -1.0f,-1.0f, 1.…

Spring cloud - Hystrix源码

其实只是Hystrix初始化部分&#xff0c;我们从源码的角度分析一下EnableCircuitBreaker以及HystrixCommand注解的初始化过程。 从EnableCircuitBreaker入手 我们是通过在启动类添加EnableCircuitBreaker注解启用Hystrix的&#xff0c;所以&#xff0c;源码解析也要从这个注解…

实时错误’-2147217887‘多步OLB DB 操作产生错误。如果可能,请检查OLE DB状态值

目录 背景问题问题分析问题解决 错误解决与定位技巧总结 背景 仍旧是学生信息管理系统的问题&#xff0c;当时做的时候没发现这么多问题呢&#xff0c;只能说明一件事&#xff0c;做的时候没有站在用户的角度考虑需求&#xff0c;设置了什么内容&#xff0c;就按照设置好的去测…

C++之常用的排序算法

C之常用的排序算法 sort #include<iostream> using namespace std; #include<vector> #include<algorithm> #include<functional> void Myptint(int val) {cout << val << " "; }void test() {vector<int> v;v.push_back(…

数据结构与算法编程题10

将两个非递减的有序链表合并为一个非递增的有序链表。 要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。 a: 1, 2, 2, 4, 5, 7, 8, 9, 10 b: 1, 2, 3, 6, 7, 8 #include <iostream> using namespace std;typedef int Elemty…

LeetCode59.螺旋矩阵

LeetCode59.螺旋矩阵 1.问题描述2.解题思路3.代码 1.问题描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,…

Docker Swarm总结(1/3)

目录 1、swarm 理论基础 1.1 简介 1.2 节点架构 1.3 服务架构 1.4 服务部署模式 2、swarm 集群搭建 2.1 需求 ​2.2 克隆主机 2.3 启动5个docker宿主机 2.4 查看 swarm 激活状态 2.5 关闭防火墙 2.6 swarm 初始化 2.7 添加 worker 节点 2.8 添加 manager 节点 3、…

[补题记录] Complete the Permutation(贪心、set)

URL&#xff1a;https://codeforces.com/group/OcmZ7weh45/contest/487583/problem/J 目录 Problem/题意 Thought/思路 Code/代码 Problem/题意 给出一个长度为 N 的序列&#xff0c;其中的元素都是奇数。 现在要求在两个奇数之间插入一个偶数&#xff0c;使得这三个数递增…

python基础-numpy

numpy中shape (1,X) 和 &#xff08;X&#xff0c;&#xff09;的区别 参考 首先放结论&#xff1a;shape(x,)是一维数组&#xff0c;ndim1,[1,2,3,…x] ;shape(1,x)是二维&#xff1f;数组&#xff0c;ndim2,[[1,2,3,…n]] 由于array.shape 表示数组的维度&#xff0c;返回一…

优秀智慧园区案例 - 上海世博文化公园智慧园区,先进智慧园区建设方案经验

一、项目背景 世博文化公园是上海的绿色新地标&#xff0c;是生态自然永续、文化融合创新、市民欢聚共享的大公园。作为世博地区的城市更新项目&#xff0c;世博文化公园的建设关乎上海城市风貌、上海文化展示、城市生态环境、市民游客体验、上海服务品牌等&#xff0c;被赋予…

【Java】基于SaaS模式的Java基层医院卫生健康云HIS系统源码

一、模板管理 模板分为两种&#xff1a;病历模板和报表模板。模板管理是运营管理的核心组成部分&#xff0c;是基层卫生健康云中各医疗机构定制电子病历和报表的地方&#xff0c;各医疗机构可根据自身特点特色定制电子病历和报表&#xff0c;制作的电子病历及报表可直接在业务…

万字解析设计模式之组合模式、亨元模式

一、组合模式 1.1概述 组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构&#xff0c;以表示“部分-整体”的层次结构。组合模式使得客户端可以一致地对待单个对象和对象组合&#xff0c;从而将复杂的层次结构展现为一个统一的树形结构。 在组合模式中&…

2023年危险化学品经营单位主要负责人证模拟考试题库及危险化学品经营单位主要负责人理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年危险化学品经营单位主要负责人证模拟考试题库及危险化学品经营单位主要负责人理论考试试题是由安全生产模拟考试一点通提供&#xff0c;危险化学品经营单位主要负责人证模拟考试题库是根据危险化学品经营单位主…

Unity 三维场景的搭建 软件构造实验报告

实验2&#xff1a;仿真系统功能实现 1.实验目的 &#xff08;1&#xff09;熟悉在Unity中设置仿真场景&#xff1b; &#xff08;2&#xff09;熟悉在Unity中C#语言的使用&#xff1b; &#xff08;3&#xff09;熟悉仿真功能的实现。 2.实验内容 新建一个仿真场景&#x…

【计算机网络学习之路】TCP socket编程

文章目录 前言一. 服务器1. 初始化服务器2. 启动服务器 二. 客户端三. 多进程服务器结束语 前言 本系列文章是计算机网络学习的笔记&#xff0c;欢迎大佬们阅读&#xff0c;纠错&#xff0c;分享相关知识。希望可以与你共同进步。 本篇博客基于UDP socket基础&#xff0c;介绍…