【问题标题】:How do I get the correct IP from HTTP_X_FORWARDED_FOR if it contains multiple IP Addresses?如果 HTTP_X_FORWARDED_FOR 包含多个 IP 地址,我如何从它获取正确的 IP?
【发布时间】:2010-10-19 17:06:37
【问题描述】:

如果 Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 返回多个 ip,我应该使用哪一个以及如何在 c# 中执行?我的理解是,如果它是空白或 null,那么客户端计算机不会通过代理,我可以从 Request.ServerVariables [“REMOTE_ADDR”] 获取他们的 ip。这是正确的说法吗?

“我拿哪个”,我的意思是我是拿列表中的第一个 IP 还是最后一个 IP,我所要做的就是将它拆分成一个数组,然后取一个我想要的。我不太确定 HTTP_X_FORWARDED_FOR 是如何工作的。

【问题讨论】:

    标签: c#


    【解决方案1】:

    根据this,X-Forwarded-For HTTP header的格式为:

    X-Forwarded-For: client1, proxy1, proxy2, ...
    

    所以你想要的客户端的IP地址应该是列表中的第一个

    【讨论】:

      【解决方案2】:

      关于可靠性主题的进一步说明:

      任何人都可以使用诸如 Firefox 插件“篡改数据”之类的工具或他们自己的本地代理(例如 Privoxy)来伪造 HTTP_X_FORWARDED_FOR。这意味着整个字符串可能是假的,而 REMOTE_ADDR 是实际的原始主机。这也可能意味着第一个“client1”地址是伪造的,然后客户端通过代理连接,导致 proxy1 是客户端的 IP 地址,REMOTE_ADDR 是使用的单个代理。

      如果您希望基于 IP 拒绝访问,我建议您检查 XFF 标头中的每个 IP 地址以及 REMOTE_ADDR。

      如果您希望根据 IP 的区域授予访问权限,我建议您仅在 XFF 为空白且 IP 来自正确区域时才允许访问。

      然而,正如 Mastermind 已经指出的那样,有些代理会隐藏代理链。例如,Tor 网络会使请求看起来好像来自最终代理机器,而不是原始 IP。匿名代理通常会声称他们正在转发 REMOTE_ADDR 中报告的相同 IP。

      基于 IP 的过滤通常是一种非常粗糙的、最后的访问控制机制。

      【讨论】:

      • 那么为什么像 AWS 和 Azure 这样的公司要依赖 IP 地址来配置安全组规则呢?
      【解决方案3】:

      前段时间我问了一个非常相似的问题。

      Getting the client IP address: REMOTE_ADDR, HTTP_X_FORWARDED_FOR, what else could be useful?

      正如正确指出的那样,您可以将第一个值视为客户端的 IP 地址。但它也可能是公司网关 IP。

      而且匿名代理无论如何都会清除此标头中的信息,因此它有用但不可靠。

      【讨论】:

        【解决方案4】:

        实际的客户端 IP 应该是标头值中最左边的 IP 地址。您可以使用正则表达式将其提取到环境变量中:

        SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=$1
        

        注意使用 $1 来设置 XFFCLIENTIP 环境变量以保存正则表达式中第一组的内容(在括号中)。

        作为使用此示例的示例,您可以定义使用该变量的日志格式:此示例是我们在 nearmap.com 内部使用的示例,因此它记录了额外的信息,但您想要的位是 % {XFFCLIENTIP}e 开头。请注意行尾的 env=XFFCLIENTIP,这意味着仅在设置了环境变量时才使用此格式。

        CustomLog /var/log/apache2/access.log "%{XFFCLIENTIP}e \"%{session}C\" \"%{nearmapuid}C\" %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" env=XFFCLIENTIP
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-27
          • 2019-05-18
          • 1970-01-01
          • 1970-01-01
          • 2010-12-21
          • 1970-01-01
          相关资源
          最近更新 更多