传入的 HTTPS 请求中的“主机”有多可靠?

传入的 HTTPS 请求中的“主机”有多可靠?

我试图了解当我的 API 收到api.foo.com来自指定foo.com主持人标题中的值。

具体来说 - 这是可以伪造的东西吗(甚至可能很容易伪造?)或者对于某些人来说从完全不同的位置发送某些东西api.foo.com并在标题中欺骗主机是否困难(不可能?) foo.com

如果这并不困难或不可能,那么用于验证请求是否来自可信地方的行业标准机制是什么?

答案1

Host头是 HTTP 请求的一部分,用于指定向 Web 服务器上的哪个虚拟主机发出请求。

它与请求的来源无关。任何人都可以向您的 Web 服务器发出 HTTP/HTTPS 请求,并google.comHost标头中指定。然后由您的 Web 服务器决定如何处理该请求。

浏览器通常会在请求中添加 HTTPReferer标头,以指示提供此请求的 URL 的来源页面。但是,Referer字段也是不可信的用户输入,很容易被伪造。

一个例子:

用户正在访问http://www.example.com/example网站,该网站包含指向 的超链接http://www.example.org。用户点击该链接。用户的浏览器将请求发送到 的 IP 地址www.example.org,并带有以下 HTTP 标头:

Host: www.example.org
Referer: http://www.example.com/example

最近,浏览器在进行跨域请求时,已开始剥离Referer标头内容,以便其仅包含根 URL:。http://www.example.com

总的来说,您不能相信任何 HTTP 请求标头包含您期望的准确数据,因为它是不受信任的用户输入。

答案2

Host:请求标头(RFC 7230§5.4) 是不受信任的用户输入。它由用户代理提供,用于指示 HTTP 请求所属的(虚拟)主机。任何恶意用户代理都可以连接到您的服务器并使用无效的 Host: 标头发出请求。

在处理请求之前,您需要验证 Host: 标头的内容是否与您的实际主机名相对应。通常,Web 服务器(nginx、Apache 等)会为您处理此问题,然后将请求传递给您的应用。但是,如果您将应用直接暴露在互联网上,而不是在常规 Web 服务器后面,那么您必须自己验证。

相关内容