我在写域名备份功能,想要修改请求的 IP 地址,同时又将原有的请求域名带上。实现方法是修改请求的地址,在 HttpRequestMessage 的 Header 上添加 HOST 记录,记录的值就是原有的域名。然而在开启 Fiddler 之后,将会发现实际发出的请求的 HOST 是实际请求的地址

预计这个是 Fiddler 的已知问题

我的实现方法是给 HttpRequestMessage 的 Headers 设置上 Host 的内容,接着修改 RequestUri 为某个 IP 地址,从而实现域名备份功能。域名备份是我为了解决国内诡异的网络环境的问题而引入的技术方案,域名备份的实现方法是运维将后台在多个地方提供访问入口,可选的是将后台在多个城市部署多套,或者只部署一套后台但是在其他城市提供可访问入口,如内部代理等方式。客户端拿到后台的多个访问域名,如果首选域名访问不通,则尝试使用备份的域名进行访问。甚至有时期望能绕过 DNS 污染,直接访问已知的后台 IP 访问后台

此时需要保持行为一致,让后台可以拿到的请求 Host 保持和原来一样。这就是本文所记录的问题的遇到的原因。我的代码如下:

        var httpRequestMessage = new HttpRequestMessage();
httpRequestMessage.Headers.Host = host;
httpRequestMessage.Method = HttpMethod.Post;
httpRequestMessage.RequestUri = new Uri(actualHost); using var httpClient = new HttpClient();
var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage);

为了方便测试,我加上了测试使用的后台,测试后台的框架代码如下:

class TestHost : IDisposable
{
public TestHost(string host, WebApplication app)
{
Host = host;
App = app;
} public string Host { get; }
public WebApplication App { get; } public void Dispose()
{
App.DisposeAsync();
}
} static class TestHostBuilder
{
public static TestHost GetTestHost(Action<WebApplication> configure)
{
var port = GetAvailablePort();
var builder = WebApplication.CreateBuilder();
var host = $"http://127.0.0.1:{port}/";
builder.WebHost.UseUrls(host);
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); var app = builder.Build(); configure(app); _ = app.RunAsync(); return new TestHost(host, app);
} public static int GetAvailablePort()
{
return GetAvailablePort(IPAddress.Loopback);
} /// <summary>
/// 获取一个可用端口
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public static int GetAvailablePort(IPAddress ip)
{
using var socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(ip, 0));
socket.Listen(1);
var ipEndPoint = (IPEndPoint) socket.LocalEndPoint!;
var port = ipEndPoint.Port;
return port;
}
}

测试后台是通过在本机开启一个随机的端口然后提供访问的方式,具体实现如下

        var host = "unknownaddressxxxxxxxxxxxasdxx.xxxxxx";

        using var testHost = TestHostBuilder.GetTestHost(app =>
{
app.MapPost("/", () =>
{
var httpContextAccessor = app.Services.GetRequiredService<IHttpContextAccessor>(); // 测试可以拿到域名
if (httpContextAccessor.HttpContext!.Request.Host.Host == host)
{
return "Return";
} return null;
});
});

以上使用 IHttpContextAccessor 可以拿到 HttpContext 对象,从而获取到请求的 Host 内容。上面测试代码写了一个叫 unknownaddressxxxxxxxxxxxasdxx.xxxxxx 的不存在的域名,期望能在测试的后台里面收到的请求使用此域名

修改调用的代码如下

        var httpRequestMessage = new HttpRequestMessage();
httpRequestMessage.Headers.Host = host;
httpRequestMessage.Method = HttpMethod.Post;
httpRequestMessage.RequestUri = new Uri(testHost.Host); using var httpClient = new HttpClient();
var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage);
var result = await httpResponseMessage.Content.ReadAsStringAsync();
Console.WriteLine(result);

在开启了 Fiddler 抓包工具之后,抓到的请求如下

POST http://127.0.0.1:50662/ HTTP/1.1
Host: 127.0.0.1:50662
Content-Length: 0

测试后台收到的 Host 也是 127.0.0.1:50662 而不是期望的测试域名

关闭 Fiddler 抓包工具之后,在测试后台可以收到期望的测试域名

因此抓包工具 Fiddler 将会篡改请求的 Host 信息为请求的实际地址的域名。我不知道如何配置 Fiddler 禁用此行为,还请知道如何配置的大佬教教我

本文的测试代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 5066e8e0a494bfe571210bb3dfa748c27209e986

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 5066e8e0a494bfe571210bb3dfa748c27209e986

获取代码之后,进入 HiwelairchawCekaywebeale 文件夹

dotnet 开启 Fiddler 抓包将会让请求 HOST 头被更改的更多相关文章

  1. Fiddler抓包-get与post请求

    from:https://www.cnblogs.com/yoyoketang/p/6719717.html 本篇以博客园的请求为例,简单分析get与post数据有何不一样,以后也能分辨出哪些是get ...

  2. Fiddler抓包1-抓firefox上https请求

    前言 fiddler是一个很好的抓包工具,默认是抓http请求的,对于pc上的https请求,会提示网页不安全,这时候需要在浏览器上安装证书. 一.网页不安全 1.用fiddler抓包时候,打开百度网 ...

  3. Fiddler抓包1-抓firefox上https请求【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/p/6538021.html 前言 fiddler是一个很好的抓包工具,默认是抓http请求的, ...

  4. 不安装证书如何通过模拟器+Fiddler抓包APP的HTTPS请求?

    模拟器抓取https方法 说明:为了解决安卓手线上不能抓取https请求,以下整理通过模拟器抓取https请求方法如下:前置条件:安卓模拟器:夜神抓包工具:Fiddler汉化中文升级版1无需FIDDL ...

  5. [Fiddler] 开启Fiddler抓包的时候产品报“证书错误”

    报错截图: 解决办法:同时开启产品和Fiddler,做如下处理:

  6. fiddler抓包软件的使用--请求头--ajax

    User-Agent: FiddlerHost: localhost:49828Content-Length: 0Accept: application/xmlContent-Type: applic ...

  7. Python+Requests接口测试教程(1):Fiddler抓包工具

    本书涵盖内容:fiddler.http协议.json.requests+unittest+报告.bs4.数据相关(mysql/oracle/logging)等内容.刚买须知:本书是针对零基础入门接口测 ...

  8. fiddler抓包详解

    image.png 前言 fiddler是一个很好的抓包工具,默认是抓http请求的,对于pc上的https请求,会提示网页不安全,这时候需要在浏览器上安装证书. 一.网页不安全 1.用fiddler ...

  9. Fiddler抓包11-HTTPS证书Actions无法导出问题

    前言 在点Actions时候出现Export Failed:The root certificate could not be located.最近有很多小伙伴在fiddler导出证书的时候,遇到无法 ...

  10. Fiddler抓包3-查看get与post请求

    前言 前面两篇关于Fiddler抓包的一些基本配置,配置完之后就可以抓到我们想要的数据了,接下来就是如何去分析这些数据. 本篇以博客园的请求为例,简单分析get与post数据有何不一样,以后也能分辨出 ...

随机推荐

  1. Oracle与MySQL的差异和对比

    Oracle与MySQL的差异和对比:配套hands-on参考脚本. 方便客户针对培训课件内容进行动手实践,加强理解. --------------------------------- -- 主题: ...

  2. C#词云生成器

    GitHub - sdcb/Sdcb.WordCloud: Generate WordCloud image from .NET/.NET Core 效果 根据mask生成

  3. System.gc 之后到底发生了什么 ?

    本文基于 OpenJDK17 进行讨论 在 JDK NIO 针对堆外内存的分配场景中,我们经常会看到 System.gc 的身影,比如当我们通过 FileChannel#map 对文件进行内存映射的时 ...

  4. #笛卡尔树,构造#洛谷 7726 天体探测仪(Astral Detector)

    题目传送门 分析 考虑每个数字一定会影响一定的范围, 那么可以记录每个数影响的最长区间和产生的个数, 那么通过这个可以解方程求出对于这个最长区间这个数的所在位置, 可以发现它可以满足一个树形结构,直接 ...

  5. #莫比乌斯反演,整除分块,欧拉定理#U137539 虚伪的最小公倍数

    题目 \[\large\prod_{i_1=1}^n\prod_{i_2=1}^n\dots\prod_{i_k=1}^n\frac{i_1*i_2*\dots*i_k}{gcd(i_1,i_2,\d ...

  6. ubuntu环境下安装perf工具

    检查当前环境内核的版本,执行如下命令: uname -a 输出信息如下: Linux jackie-ubuntu 5.4.0-26-generic #30-Ubuntu SMP Mon Apr 20 ...

  7. Docker 学习路线 3:安装设置 Docker Desktop 与 Docker 引擎指南

    Docker提供了一个名为Docker Desktop的桌面应用程序,简化了安装和设置过程.还有另一个选项可以使用Docker引擎进行安装. Docker Desktop网站 Docker引擎 Doc ...

  8. HDC2021技术分论坛:还有人不知道鸿蒙智联设备认证咋搞?

    作者:maxiansheng,华为鸿蒙智联认证测试专家 2021年5月18日,华为正式宣布原Work With HUAWEI HiLink和Powered by HarmonyOS品牌升级为Harmo ...

  9. 基于 Java 编程生成二维码图片

    0x01 准备 (1)软件版本 IntelliJ IDEA 2023.1.3 JDK 18 Tomcat 10.1.11 Maven 3.8.6 (2)技术栈 servlet zxing 谷歌项目 生 ...

  10. css 你真的了解padding吗?

    前言 padding 简写属性在一个声明中设置所有内边距属性,实际上在使用过程中它对block元素和内联元素的处理是不一样的. 正文 对于block元素 如果宽度非auto那么容器会变大,如果容器宽度 ...