我们在ASP.NET中使用Request.UserHostAddress
来获取IP地址,但这通常是用户的ISP的IP地址,而不完全是用户机器的IP地址,例如,用户点击了一个链接。如何获取真实IP地址?
例如,在堆栈溢出用户配置文件中是:“最后一个帐户活动:4小时前来自86.123.127.8",但我的机器IP地址有点不同。Stack Overflow是如何获得此地址的?
在某些web系统中,存在用于某些目的的IP地址检查。例如,对于特定的IP地址,用户每24小时只能点击5次下载链接吗?此IP地址应该是唯一的,而不适用于拥有大量客户端或Internet用户的ISP。
我理解得很好吗?
发布于 2009-04-09 18:37:15
正如其他人所说,你不能做你所要求的事情。如果你描述了你正在尝试解决的问题,也许有人可以帮助你?
例如。
你在服务器上看到的地址不应该是的地址,正如你所说的,这将是一个很大的范围。宽带家庭用户的地址将是其路由器的地址,因此房屋内的每台设备在外观上看起来都是相同的,但路由器使用NAT来确保流量正确路由到每台设备。对于从办公环境访问的用户,所有用户的地址可能都是相同的。使用IP地址作为ID的站点会冒着非常错误的风险--你给出的例子都很好,而且经常失败。例如,我的办公室在英国,突破点(我“看起来”在互联网上)是在另一个国家,我们的主要IT设施在那里,所以从我的办公室来看,我的IP地址似乎不在英国。由于这个原因,我不能只访问英国的网络内容,如BBC iPlayer)。在任何时候,我的公司都会有成百上千的人似乎从同一个IP地址访问网络。
当您编写服务器代码时,您永远无法确定您看到的IP地址所指的是什么。一些用户喜欢这种方式。有些人故意使用代理或VPN来进一步迷惑您。
当您说您的计算机地址与StackOverflow上显示的IP地址不同时,您如何找到您的计算机地址?如果你只是在本地使用ipconfig
或类似的东西,我希望它会因为我上面概述的原因而有所不同。如果你想仔细看看外界的想法,那就看看whatismyipaddress.com/吧。
这篇Wikipedia link on NAT将为你提供一些背景知识。
发布于 2009-04-11 17:03:57
通常你会想知道访问你网站的人的IP地址。虽然ASP.NET有几种方法可以做到这一点,但我们所见过的最好的方法之一是使用ServerVariables集合的"HTTP_X_FORWARDED_FOR“。
这就是为什么。
有时,您的访问者位于代理服务器或路由器后面,而标准Request.UserHostAddress
仅捕获代理服务器或路由器的IP地址。在这种情况下,用户的IP地址将存储在服务器变量("HTTP_X_FORWARDED_FOR")中。
所以我们要做的是首先检查"HTTP_X_FORWARDED_FOR“,如果它是空的,那么我们简单地返回ServerVariables("REMOTE_ADDR")
。
虽然这种方法不是万无一失的,但它可以带来更好的结果。下面是VB.NET中的ASP.NET代码,摘自James Crowley's blog post "Gotcha: HTTP_X_FORWARDED_FOR returns multiple IP addresses"
C#
protected string GetIPAddress()
{
System.Web.HttpContext context = System.Web.HttpContext.Current;
string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
{
string[] addresses = ipAddress.Split(',');
if (addresses.Length != 0)
{
return addresses[0];
}
}
return context.Request.ServerVariables["REMOTE_ADDR"];
}
VB.NET
Public Shared Function GetIPAddress() As String
Dim context As System.Web.HttpContext = System.Web.HttpContext.Current
Dim sIPAddress As String = context.Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If String.IsNullOrEmpty(sIPAddress) Then
Return context.Request.ServerVariables("REMOTE_ADDR")
Else
Dim ipArray As String() = sIPAddress.Split(New [Char]() {","c})
Return ipArray(0)
End If
End Function
发布于 2012-03-05 21:27:50
更新:感谢布鲁诺·洛佩斯。如果可能出现多个ip地址,则需要使用此方法:
private string GetUserIP()
{
string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipList))
{
return ipList.Split(',')[0];
}
return Request.ServerVariables["REMOTE_ADDR"];
}
https://stackoverflow.com/questions/735350
复制相似问题