读取 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