获取用户的IP地址

Len*_*ers 19 asp.net ip-address

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

Ale*_*lex 25

编辑:还发现了关于IP相关的HTTP头一个有趣的问题在这里.

Edit2:正如我在上面提供的评论和链接中所提到的,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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,"X-Forwarded-For"标头可以伪造,因此不要根据它做出任何安全决定.如果计算机位于负载平衡器或反向代理后面,则仅检查"HTTP_X_FORWARDED_FOR"值. (4认同)
  • 另请注意,如果传递多个代理,HTTP_X_FORWARDED_FOR将包含多个IP地址.Parse方法是否正确处理? (2认同)
  • 如果有人想知道(就像我一样),HTTP_X_FORWARDED_FOR列表中的第一个IP就是原始IP(所以这个例子是正确的,至少根据维基百科).也就是说,如果你这样做是为了记录日志,我建议只记录整个REMOTE_ADDR和HTTP_X_FORWARDED_FOR标头.让人类决定在发生攻击时哪些信息有用. (2认同)

Yon*_*ing 20

HttpContext.Current.Request.UserHostAddress;

要么

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

要么

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

  • 两个第一选择之间有什么区别? (3认同)