【问题标题】:HttpListener: listen to a port with explicit host name (no top level wildcards)HttpListener:监听具有显式主机名的端口(无顶级通配符)
【发布时间】:2019-04-11 14:55:39
【问题描述】:

假设我有一台 IP 为 183.41.22.22 的机器。我想收听将发送到本地主机上此 IP 的端口 43 的所有 HTTP 消息。其实我对发送到这个端口的所有消息都不是很感兴趣,只对发送到https://183.41.22.22:443/CustomerData/的消息感兴趣

class HttpListener 的文档说我应该添加一个前缀。他们举了一个例子:http://www.contoso.com:8080/customerData/

这是否意味着在我的情况下我应该添加前缀https://183.41.22.22:443/CustomerData/?还是我应该使用https://localhost:443/CustomerData/

另外,由于我的计算机专门用于此任务,我确信我计算机上的任何其他人都不应该收到任何发送到端口 443 的消息。因此,根据相同的文档,我也可以使用通配符: http://*:443

但是,文档警告:

不应使用顶级通配符绑定(http://*:80/ 和 http://+:80)。顶级通配符绑定会产生应用程序安全漏洞。这适用于强通配符和弱通配符。使用明确的主机名或 IP 地址而不是通配符。

什么是显式主机名?是CustomerData的部分吗?

对于那些感兴趣的人,代码的简化部分(没有适当的可能结束程序)

using (var httpListener = new HttpListener())
{
    httpListener.Prefixes.Add("https://*:443/");
    httpListener.Start();

    while (true)
    {
        var context = httpListener.GetContext();
        var httpRequest = context.Request();

        // fill the response
        string responseText = this.CreateResponseText(httpRequest);
        byte[] buf = Encoding.UTF8.GetBytes(responseText);
        context.Response.ContentLength64 = buf.Length;
        context.Response.OutputStream.Write(buf, 0, buf.Length);
    };

【问题讨论】:

  • 您可以从 cmd.exe 执行 ping 以查看 localhost 设置为 >Ping localhost
  • “我应该使用localhost:443/CustomerData”你试过了吗?发生了什么?
  • 虽然前缀https://*8080(和其他端口)有效,但我无法测试警告的漏洞。所以我不确定使用这个前缀是否安全

标签: c# httplistener


【解决方案1】:

什么是显式主机名?是 CustomerData 部分吗?

主机名就是通常所说的“域”。见The components of a URL。警告还包含更多信息(您可能为了简洁而遗漏了这些信息,但它包含重要信息):

如果您控制整个父域(而不是易受攻击的*.com),则子域通配符绑定(例如,*.mysub.com)不存在这种安全风险。请参阅rfc7230 section-5.4 了解更多信息。

RFC 部分引用了HTTP Host header。这是 HTTP/1.1 规范的一部分,当人们在网络早期开始 running more than 1 website on a host 时引入了它。主机(“机器”)用于简单地侦听(通常)端口 80 并提供客户端请求的页面。但是当网络开始变得更广泛使用时,需要在一台机器上“托管”多个网站。你可以让foo.combar.com,使用DNS,都指向同一个IP,但是机器不知道是发送foo.com 主页还是bar.com 的主页。于是就引入了Host头;然后,网络浏览器(更准确地说:http 客户端)可以让服务器知道他们对哪个主机感兴趣并且可以提供正确的页面。

请注意,域的每个部分(例如 sub.domain.foo.co.uk可能指向不同的主机(但它们也可能都指向同一主机)。使用top-level domain 通配符(例如*.com,或更糟:*)是一个潜在风险,因为任何人都可以获得.com 域(myevildomain.com)并将其指向您的服务器.如果你使用*.company.com 除了company.com 之外没有人可以控制子域。 为什么这是一个安全风险是另一回事,但它的要点是使用通配符 *.com 将使您的应用程序响应任何以 .com 结尾的 host 标头,而 @987654342 @ 将阻止您的应用程序响应请求 myevildomain.com 的(可能被欺骗的)客户端。

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多