获取用户的IP地址

20

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

5个回答

25

编辑:在这里还找到了一个有关IP相关的HTTP头部的有趣问题here

编辑2:如评论和我提供的链接中所述,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;
    }

4
请注意,X-Forwarded-For头可以被伪造,因此不要基于它做出任何安全决策。仅在机器位于负载均衡器或反向代理后面时,请检查HTTP_X_FORWARDED_FOR的值。 - devstuff
2
请注意,如果通过多个代理传递,则HTTP_X_FORWARDED_FOR将包含多个IP地址。 Parse方法是否能正确处理这种情况? - Tomas
@Tomas:不行,这样做不行。我会在几分钟内更正我的答案。谢谢! - Oleks
现在我已经过去了将近一年,但这是否保证会返回客户端IP呢?假设代理伪造了“X-Forwarded-For”,然后代理有自己的映射,那么客户端IP就无法到达主机。我是对的吗?此外,您确定第一个IP是原始IP吗...我的意思是,代理和负载均衡器定义为追加而不是前置IP列表。 - Tomas Jansson
@Tomas Jansson:在这种处理IP地址的方式中,您无法确定给定的IP地址是否有效。我假设至少一半是真实的IP地址(而不是伪造的),但不幸的是我没有任何统计数据。所以我对你的问题的回答是:不是;是的;不是。 - Oleks
2
如果有人想知道(就像我一样),HTTP_X_FORWARDED_FOR列表中的第一个IP是源IP(所以这个例子至少根据维基百科是正确的)。话虽如此,如果您正在为记录目的而进行此操作,我建议仅记录整个REMOTE_ADDR和HTTP_X_FORWARDED_FOR头。在攻击情况下,让人类决定哪些信息是有用的。 - Jordan Morris

20

HttpContext.Current.Request.UserHostAddress;

or

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

or

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


4
这两个选择的区别是什么? - Tomas Jansson

2

Request.UserHostAddress


1
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。


0

尝试使用以下代码获取用户的外部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; }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接