X-Forwarded-For
X-Forwarded-For
(XFF) 请求头是用于识别通过代理服务器连接到 Web 服务器的客户端原始 IP 地址的事实标准标头。
警告:不正确使用此标头可能会带来安全风险。有关详细信息,请参阅安全和隐私问题部分。
当客户端直接连接到服务器时,客户端的 IP 地址会发送到服务器(并且通常会写入服务器访问日志)。但是,如果客户端连接通过任何转发或反向代理,则服务器只能看到最终代理的 IP 地址,这通常用处不大。如果最终代理是与服务器位于同一安装中的负载均衡器,则尤其如此。因此,为了向服务器提供更有用的客户端 IP 地址,使用了X-Forwarded-For
请求标头。
有关使用此标头的详细指南,请参阅解析和选择 IP 地址部分。
此标头的标准化版本是 HTTP Forwarded
标头。
安全和隐私问题
根据设计,此标头会公开隐私敏感信息,例如客户端的 IP 地址。因此,在部署此标头时必须牢记用户的隐私。
当客户端和服务器之间没有可信的反向代理(例如负载均衡器)时,X-Forwarded-For
标头是不可信的。如果客户端和所有代理都是良性和行为良好的,则标头中的 IP 地址列表具有指令部分中描述的含义。但是,如果存在客户端或任何代理存在恶意或错误配置的风险,则标头的任何部分(或全部)都可能被欺骗(并且可能不是列表或根本不包含 IP 地址)。
如果客户端和服务器之间存在任何可信的反向代理,则最终的X-Forwarded-For
IP 地址(每个可信代理一个)是可信的,因为它们是由可信代理添加的。(只要服务器只能通过这些代理访问,而不能直接访问,则为真)。
X-Forwarded-For
的任何与安全相关的用途(例如速率限制或基于 IP 的访问控制)只能使用可信代理添加的 IP 地址。使用不可信的值会导致速率限制规避、访问控制绕过、内存耗尽或其他负面的安全或可用性后果。
相反,最左边的(不可信的)值只能在使用欺骗值不会产生负面影响的情况下使用。
语法
X-Forwarded-For: <client>, <proxy1>, <proxy2>
元素以逗号分隔,逗号周围可能有可选的空格。
指令
- <client>
-
客户端 IP 地址
- <proxy1>, <proxy2>
-
如果请求通过多个代理,则会列出每个后续代理的 IP 地址。这意味着,在客户端和代理行为良好的情况下,最右边的 IP 地址是最新的代理的 IP 地址,最左边的 IP 地址是原始客户端的 IP 地址。
示例
X-Forwarded-For: 2001:db8:85a3:8d3:1319:8a2e:370:7348
X-Forwarded-For: 203.0.113.195
X-Forwarded-For: 203.0.113.195, 2001:db8:85a3:8d3:1319:8a2e:370:7348
X-Forwarded-For: 203.0.113.195,2001:db8:85a3:8d3:1319:8a2e:370:7348,198.51.100.178
解析
X-Forwarded-For
标头的解析不正确会导致欺骗值用于安全相关目的,从而导致上述负面后果。
请求中可能存在多个X-Forwarded-For
标头。这些标头中的 IP 地址必须视为单个列表,从第一个标头的第一个 IP 地址开始,一直持续到最后一个标头的最后一个 IP 地址。有两种方法可以创建此单个列表
- 将
X-Forwarded-For
完整标头值用逗号连接,然后按逗号拆分为列表,或者 - 将每个
X-Forwarded-For
标头按逗号拆分为列表,然后连接这些列表
仅使用多个X-Forwarded-For
标头中的一个是不够的。
(某些反向代理会自动将多个X-Forwarded-For
标头连接到一个,但最安全的方法是不假设这种情况)。
选择 IP 地址
选择地址时,必须使用所有X-Forwarded-For
标头中的完整 IP 列表。
在选择最靠近客户端的X-Forwarded-For
客户端 IP 地址(不可信且不用于安全相关目的)时,应选择最左边第一个有效地址且不是私有/内部的地址。(“有效”是因为欺骗值可能根本不是 IP 地址;“不是内部/私有”是因为客户端可能在其内部网络上使用了代理,这可能添加了来自私有 IP 空间的地址)。
在选择第一个可信的X-Forwarded-For
客户端 IP 地址时,需要额外的配置。有两种常见的方法
-
可信代理计数:配置了互联网和服务器之间的反向代理数量。
X-Forwarded-For
IP 列表从最右边开始搜索,搜索次数为该计数减一。(例如,如果只有一个反向代理,则该代理将添加客户端的 IP 地址,因此应使用最右边的地址。如果有三个反向代理,则最后两个 IP 地址将是内部的)。 -
可信代理列表:配置了可信反向代理的 IP 或 IP 范围。
X-Forwarded-For
IP 列表从最右边开始搜索,跳过可信代理列表上的所有地址。第一个不匹配的地址是目标地址。
第一个可信的X-Forwarded-For
IP 地址可能属于不可信的中间代理,而不是实际的客户端计算机,但它是唯一适合安全用途的 IP。
请注意,如果服务器可以直接从互联网连接(即使它也位于可信的反向代理后面)——X-Forwarded-For
IP 列表的任何部分都不能被视为可信或安全用于安全相关用途。
规范
不是任何当前规范的一部分。此标头的标准化版本是Forwarded
。