读取 X-Forwarded-For 标头

Posted

技术标签:

【中文标题】读取 X-Forwarded-For 标头【英文标题】:Read X-Forwarded-For header 【发布时间】:2011-06-11 15:35:16 【问题描述】:

我想读取请求中X-Forwarded-For 标头值的值。

我试过了

HttpContext.Current.Request.Headers["X-Forwarded-For"].Split(new char[]  ',' ).FirstOrDefault();  

在 C# 中。

或者我需要用":" 分割标题并取第二个字符串吗? 我问这个是因为,***说

字段的一般格式是: X-Forwarded-For:client1、proxy1、proxy2

【问题讨论】:

你的代码是正确的,除了我会这样做:HttpContext.Current.Request.Headers["X-Forwarded-For"].Split(',').FirstOrDefault(); nuget.org/packages/XFF 【参考方案1】:

返回的格式是client1,proxy1,proxy2

所以你用逗号分割它,然后第一个看到你的客户端的ip。

【讨论】:

此建议很危险,尤其是用于访问控制时。发起客户端还可以在他的请求中添加一个 X-Forwarded-For 标头,然后通常在其中插入一个内部 IP 地址。谷歌“X-Forwarded-For hack”。您必须向后工作并断言每个地址都是您控制的代理。当您遇到一个您不知道的 IP 地址时,您可以使用它作为客户端地址。这样,如果黑客从一个 IP 地址开始列表,可能是您认为是网络内部的 IP 地址,您将不会信任它。 @stolsvik 我认为无论如何都不能使用 ip 进行访问控制。 ip 用于统计,如果可能的话,用于检查不良行为。【参考方案2】:

如果有帮助,这是获取用户 IP 地址的简单方法,考虑到 X_FORWARDED_FOR 标头

var forwardedFor = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

var userIpAddress = String.IsNullOrWhiteSpace(forwardedFor) ?
    Request.ServerVariables["REMOTE_ADDR"] : forwardedFor.Split(',').Select(s => s.Trim()).FirstOrDefault();

【讨论】:

【参考方案3】:

不要忘记 X-Forwarded-For 可以包含客户端写入的任何内容。里面可以包含XSS或者SQL注入。

【讨论】:

【参考方案4】:

有时第一个可能包含一个没有用的本地(私有)保留地址。此外,第一个位置也可以进行欺骗。

更新 - 2018 年 4 月:对第一个地址为本地(私有)的现场制作网站的案例进行抽样表明最终用户的网络或其 ISP 存在一些配置问题。这些案例很少发生 (

下面的答案建议从右到左步行,直到您到达公共地址。不确定是否有人真的这样做,但它指出了问题。

https://husobee.github.io/golang/ip-address/2015/12/17/remote-ip-go.html

【讨论】:

以上是关于读取 X-Forwarded-For 标头的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine URL Fetch 为 X-Forwarded-For 标头设置的值是多少?

在 apache 中将 REMOTE_ADDR 设置为 X-Forwarded-For

如何在启用 mod_proxy 的 Apache 中获得 X-Forwarded-For

从 http.Request 获取客户端 IP 地址的正确方法

为 iframe 设置自定义 HTTP 请求标头

SIP 逻辑上的 Kamailio xhttp 模块(Websocket)标头