【问题标题】:Get User's IP Address获取用户的 IP 地址
【发布时间】:2011-02-06 22:26:01
【问题描述】:

如何获取当前访问者的 IP 地址?

【问题讨论】:

    标签: asp.net ip-address


    【解决方案1】:

    编辑:还发现了一个关于 IP 相关的 http 标头 here 的有趣问题。

    Edit2: 正如我在上面提供的 cmets 和链接中所提到的,HTTP_X_FORWARDED_FOR 标头可能包含多个用逗号分隔的 IP 地址。我没有遇到这种情况,但假设需要对我的答案进行一些更正。

    我使用此代码获取 IP 地址(如果由于某种原因失败,则返回 IPAddress.None 值):

        /// <summary>
        /// Gets the IP address of the request.
        /// <remarks>
        /// This method is more useful than built in because in some cases it may show real user IP address even under proxy.
        /// <summary>
        /// Gets the IP address of the request.
        /// <remarks>
        /// This method is more useful than built in because in some cases it may show real user IP address even under proxy.
        /// The <see cref="System.Net.IPAddress.None" /> value will be returned if getting is failed.
        /// </remarks>
        /// </summary>
        /// <param name="request">The HTTP request object.</param>
        /// <returns></returns>
        public static IPAddress GetIp(this HttpRequest request)
        {
            string ipString;
            if (string.IsNullOrEmpty(request.ServerVariables["HTTP_X_FORWARDED_FOR"]))
            {
                ipString = request.ServerVariables["REMOTE_ADDR"];
            }
            else
            {
                ipString = request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                    .FirstOrDefault();
            }
    
            IPAddress result;
            if (!IPAddress.TryParse(ipString, out result))
            {
                result = IPAddress.None;
            }
    
            return result;
        }
    

    【讨论】:

    • 请注意X-Forwarded-For 标头是可以伪造的,所以不要基于它做出任何安全决策。如果机器位于负载均衡器或反向代理之后,则仅检查 HTTP_X_FORWARDED_FOR 值。
    • 还要注意,如果传递了多个代理,HTTP_X_FORWARDED_FOR 将包含多个 IP 地址。 Parse 方法能正确处理这个问题吗?
    • @Tomas:不,这行不通。我会在几分钟内更正我的答案。谢谢!
    • 现在我好像差不多一年后了,但是能保证这会返回客户端IP吗?假设一个代理伪造X-Forwarded-For,然后代理有它自己的映射,这样客户端IP就不会到达主机。我对吗?另外,您确定第一个 IP 是原始 IP...我的意思是,它被定义为代理和负载均衡器附加而不是添加到 IP 列表中
    • 如果有人想知道(就像我一样),HTTP_X_FORWARDED_FOR 列表中的第一个 IP 是原始 IP(所以这个例子是正确的,至少根据维基百科)。也就是说,如果您这样做是为了记录,我建议您只记录整个 REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR 标头。让人类决定哪些信息在受到攻击时有用。
    【解决方案2】:

    HttpContext.Current.Request.UserHostAddress;

    HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

    HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    【讨论】:

    • 前两种选择有什么区别?
    【解决方案3】:

    Request.UserHostAddress

    【讨论】:

      【解决方案4】:
      public String GetIP()
      {
          string ipString;
          if (string.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]))
          {
              ipString = Request.ServerVariables["REMOTE_ADDR"];
          }
          else
          {
              ipString = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
          }
          return ipString;
      }
      

      首先尝试找出代理IP,如果它为空我们可以得到该系统IP

      【讨论】:

        【解决方案5】:

        试试这个来获取用户的外部IP地址..

        public static string getExternalIp()
            {
                try
                {
        
                    string externalIP;
                    externalIP = (new WebClient()).DownloadString("http://checkip.dyndns.org/");
                    externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                                 .Matches(externalIP)[0].ToString();
                    return externalIP;
                }
                catch { return null; }
            }
        

        【讨论】:

          猜你喜欢
          • 2014-09-27
          • 2012-06-12
          • 2013-08-01
          • 2015-03-23
          • 2014-08-23
          • 2013-09-21
          • 2019-01-14
          • 2019-11-13
          • 1970-01-01
          相关资源
          最近更新 更多