我试图了解当我的 API 收到api.foo.com
来自指定foo.com
为主持人标题中的值。
具体来说 - 这是可以伪造的东西吗(甚至可能很容易伪造?)或者对于某些人来说从完全不同的位置发送某些东西api.foo.com
并在标题中欺骗主机是否困难(不可能?) foo.com
?
如果这并不困难或不可能,那么用于验证请求是否来自可信地方的行业标准机制是什么?
答案1
标Host
头是 HTTP 请求的一部分,用于指定向 Web 服务器上的哪个虚拟主机发出请求。
它与请求的来源无关。任何人都可以向您的 Web 服务器发出 HTTP/HTTPS 请求,并google.com
在Host
标头中指定。然后由您的 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 服务器后面,那么您必须自己验证。