【问题标题】:fiddler: how to disable overwrite Header Host提琴手:如何禁用覆盖标头主机
【发布时间】:2012-08-08 10:55:57
【问题描述】:

使用 Fiddler 时,会弹出警告对话框。

Fiddler has detected a protocol violation in session #14.

The Request's Host header did not match the URL's host component.

URL Host:   proxy.music.pp.com
Header Host:    119.147.22.41

并且显示 Fiddler 将 HTTP Header 的主机更改为“proxy.music.pp.com”,有什么方法可以禁用 Fiddler 更改它?

【问题讨论】:

  • 是什么客户端产生了这个(非法)流量?

标签: http fiddler host


【解决方案1】:

来自我的book

交换主机标头

当 Fiddler 收到 URL 与其 Host 标头不匹配的请求时,原始 Host 值存储在会话标志 X-Original-Host 中,然后将 Host 值替换为从 URL 解析的主机。以下脚本放置在 FiddlerScript 的 BeforeRequest 函数中,通过将请求路由到原始 Host 标头指定的主机来反转行为。

if (oSession.BitFlags & SessionFlags.ProtocolViolationInRequest) 
{
  var sOverride = oSession["X-Original-Host"];
  if (!String.IsNullOrEmpty(sOverride)) 
  {
    oSession["X-overrideHost"] = sOverride;
    oSession["ui-backcolor"] = "yellow";

    // Be sure to bypass the gateway, otherwise overrideHost doesn't work
    oSession.bypassGateway = true;
  }
}

【讨论】:

  • Fiddler 的最新版本(v5.0.20182.28034,但我不知道这改变了多久)似乎不再将任何内容放入 X-Original-Host 会话标志中,因此此解决方案不会继续工作。
  • 也许是因为我使用了 Composer 功能?如何让作曲家将请求发送到“g2-prod-by3-003-sb.servicebus.windows.net”的IP地址但使用主机头“dstucki-relay.servicebus.windows.net”?当我尝试这个时,它总是使用 Host 标头值来解析 IP 地址。 snag.gy/SiQ0OA.jpg(注意 TCP 流量去往的 IP 地址是 example2.com 的)。
  • 啊,对于 Composer,尝试创建一个假的 Fiddler-Host: example.com 标头。 Composer 会将其转换为 X-OverrideHost 标志。
【解决方案2】:

你可以通过规则来做到这一点。

进入自定义规则,找到函数:OnBeforeRequest(oSession: Session)

然后在该函数的最后一行添加以下内容:

if (oSession.HostnameIs("proxy.music.pp.com")) { oSession.host = "119.147.22.41"; }

【讨论】:

  • 还是会显示协议违例的错误,但是会使用ip地址作为http头主机。
  • 这也会更改请求发送到的主机名。问题是关于防止 Fiddler 覆盖 Host 标头。
【解决方案3】:

我不明白“url 主机”应该是什么 - 我的意思是,通常情况下,HTTP 中只有 Host 标头。

仔细观察,这种违规似乎发生在初始代理“设置”请求中,如下所示:

 CONNECT targaryen:45633 HTTP/1.1
 Host: targaryen

这就是错误对我有意义的地方。

【讨论】:

    【解决方案4】:

    我无法获得现有答案所需的信息,但 Eric Law 的回答为我提供了解决问题所需的信息。我在通过 IP 地址调用 Web 服务器时遇到问题,我必须添加 Host 标头才能获得正确的端点。 Fiddler 将 Host 标头更改为我正在调用的 IP 地址并删除了我的 Host 标头值,这导致调用失败。我在 Eric 的脚本中添加了一行来解决这个问题。我将规则放入 Fiddler 规则脚本中的 OnBeforeRequest 中。

     if (oSession.BitFlags & SessionFlags.ProtocolViolationInRequest) 
        {
            var sOverride = oSession["X-Original-Host"];
    
            if (!String.IsNullOrEmpty(sOverride)) 
            {
                oSession["X-overrideHost"] = sOverride;
                oSession["ui-backcolor"] = "yellow";
                oSession.oRequest["Host"] = sOverride;
    
                // Be sure to bypass the gateway, otherwise overrideHost doesn't work
                oSession.bypassGateway = true;
            }
        }
    

    出现此错误:

    并改成这样:

    【讨论】:

    • 对于那些可能会发现这试图在 Java 中尝试为什么 Host 标头在使用 IP 地址时不会保持设置的人,似乎标准组决定符合它们必须匹配,并且 HttpURLConnection正在用自己的主机头替换我的主机头。有关此问题的更多信息,请访问 stackoverflow.com/questions/7648872/…。简短的回答是 System.setProperty("sun.net.http.allowRestrictedHeaders", "true") 覆盖该行为。
    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多