我在写域名备份功能,想要修改请求的 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. VIVADO原理图中的概念

    VIVADO原理图的基本作用 * 查看不同层次下的逻辑关系或者网表关系 * 检查逻辑设计是否可以通过数字电路实现 * 观察重要的信号的走向,分析可能的优化方向 VIVADO原理图几个基本概念 (1) ...

  2. vivado的非嵌入ILA的使用

    vivado非嵌入ILA的使用 1.实验原理 前面在vivado中联合vitis设计时接触过ila,那个时候采用的方法是直接调用IP核在原理图中连接.这个方法简单直接,可以将自己所需的测量信号转移到I ...

  3. KingbaseES Json 系列二:Json对象函数

    KingbaseES Json 系列二--Json对象函数(JSONB_BUILD_OBJECT,JSONB_OBJECT,JSON_BUILD_OBJECT,JSON_OBJECT) JSON 数据 ...

  4. archlinux xfce修改桌面字体颜色

    参照 https://forums.linuxmint.com/viewtopic.php?t=341804 1.大于等于4.14的版本则在主文件夹的 .config 文件夹 gtk-3.0 中,创建 ...

  5. #结论#洛谷 3199 [HNOI2009]最小圈

    题目 求有向图最小平均权值回路. \(n\leq 3*10^3,m\leq 10^4\) 分析 设 \(f_k(x)\) 表示从点 \(x\) 出发恰好走 \(k\) 条边的最短路, 那么答案就是 \ ...

  6. #树状数组#洛谷 4113 [HEOI2012]采花

    题目 分析 与HH的项链类似 离线处理询问,按右端点排序,维护最近的颜色和第二近的颜色,修改以第二近的颜色为准 换句话说,若最近颜色的位置为\(pos2\),第二近颜色的位置为\(pos1\) 加入一 ...

  7. Python 潮流周刊第 45 期(摘要)+ 赠书 5 本《Python语言及其应用(第2版)》

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  8. Docker学习路线13:部署容器

    部署容器是使用Docker和容器化管理应用程序更高效.易于扩展和确保跨环境一致性性能的关键步骤.本主题将为您概述如何部署Docker容器以创建和运行应用程序. 概述 Docker容器是轻量级.可移植且 ...

  9. Linux系统奇安信浏览器报错跨域:the resource is in more-private address space 'local'

    报错: Access to XMLHttpRequest at "123" from origin "456" has been blocked by CORS ...

  10. 批处理及有状态等应用类型在 K8S 上应该如何配置?

    众所周知, Kubernetes(K8S)更适合运行无状态应用, 但是除了无状态应用. 我们还会有很多其他应用类型, 如: 有状态应用, 批处理, 监控代理(每台主机上都得跑), 更复杂的应用(如:h ...