gpt4 book ai didi

c# - HttpListener:监听具有显式主机名的端口(无顶级通配符)

转载 作者:太空宇宙 更新时间:2023-11-03 12:04:42 44 4
gpt4 key购买 nike

假设我有一台带有 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

但是,文档警告:

Top-level wildcard bindings (http://*:80/ and http://+:80) should not be used. Top-level wildcard bindings create app security vulnerabilities. This applies to both strong and weak wildcards. Use explicit host names or IP addresses rather than wildcards.

什么是显式主机名?它是 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);
};

最佳答案

What is an explicit host name? Is it the part CustomerData?

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

Subdomain wildcard binding (for example, *.mysub.com) doesn't have this security risk if you control the entire parent domain (as opposed to *.com, which is vulnerable). See rfc7230 section-5.4 for more information.

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

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

关于c# - HttpListener:监听具有显式主机名的端口(无顶级通配符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55635533/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com