我在写域名备份功能,想要修改请求的 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. Openlayers 加载ArcGIS Server切片服务(自定义切片方案)

    背景 最近遇到一个需求,要使用OpenLayer加载ArcGIS Server发布的服务.如果直接拷贝OpenLayer提供的在线官方Demo,然后修改下地图服务地址是跑不通的,这是因为OpenLay ...

  2. ArcMap的mxd文件没有数据、显示感叹号怎么办?

      本文介绍在ArcMap软件中,导入.mxd地图文档文件后图层出现感叹号.地图显示空白等情况的解决办法.   在ArcMap软件使用过程中,我们经常会需要将包含有多个图层的.mxd地图文档文件导入软 ...

  3. 从零开始的 dbt 入门教程 (dbt cloud 自动化篇)

    一.引 在前面的几篇文章中,我们从 dbt core 聊到了 dbt 项目工程化,我相信前几篇文章足够各位数据开发师从零快速入门 dbt 开发,那么到现在我们更迫切需要解决的是如何让数据更新做到定时化 ...

  4. 使用Razor模板动态生成代码

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. node14.20.0安装pnpm5.15.0兼容

    1,执行命令:npm install -g pnpm@5.15.0 2,设置淘宝镜像源: pnpm config set registry https://registry.npm.taobao.or ...

  6. OWOD:开放世界目标检测,更贴近现实的检测场景 | CVPR 2021 Oral

    不同于以往在固定数据集上测试性能,论文提出了一个更符合实际的全新检测场景Open World Object Detection,需要同时识别出未知类别和已知类别,并不断地进行增量学习.论文还给出了OR ...

  7. JDBC反序列化分析

    环境依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java& ...

  8. sql语句TRUNCATE 清空表数据

    清空表数据 TRUNCATE TABLE zzsfp_hwmx;

  9. VK2C21A:抗干扰/抗噪/高稳定性LCD屏显示驱动,抗干扰LCD驱动段码屏芯片

    产品型号:VK2C21A/B/C/D 产品品牌:VINKA/永嘉微/永嘉微电 封装形式:SOP28/24/20/16 产品年份:新年份 原厂直销,工程服务,技术支持,价格最具优势! VK2C21A/B ...

  10. OpenHarmony 3.1 Release版本关键特性解析——HDI硬件设备接口介绍

    HDF 驱动框架是 OpenAtom OpenHarmony(简称"OpenHarmony")系统硬件生态开放的基础,为驱动开发者提供了驱动加载.驱动服务管理和驱动消息机制等驱动框 ...