获取调用者IP地址

11 浏览
0 Comments

获取调用者IP地址

我们可以使用 Request.UserHostAddress 在ASP.NET中获取IP地址,但这通常是用户的ISP IP地址,而不是像点击链接的用户机器IP地址。那么怎么获取真正的IP地址呢?

例如,在Stack Overflow用户资料中,它是这样显示的:\"最后一次登录: 4小时前, 来自86.123.127.8\",但我的机器IP地址有点不同。 Stack Overflow是如何获取这个地址的呢?

在一些Web系统中,有用IP地址进行某些目的的检查。例如,对于一个特定的IP地址,每24小时内用户可以只有5次下载链接的点击?这个IP地址应该是唯一的,而不是一个有很多客户或互联网用户的ISP。

我理解的对吗?

admin 更改状态以发布 2023年5月24日
0
0 Comments

正如其他人所说,你不能做你所要求的。如果你描述一下你试图解决的问题,也许有人可以帮忙?

例如:

  • 你是否正在尝试唯一地识别你的用户?
  • 你是否可以使用cookie或会话ID,而不是IP地址?

编辑 你在服务器上看到的地址不应该是ISP的地址,就像你所说这将是一个巨大的范围。家庭宽带用户的地址将是他们路由器上的地址,因此,房间里的每个设备在外部看起来都是相同的,但路由器使用NAT确保流量正确地路由到每个设备。对于从办公环境访问的用户,地址可能对所有用户都是相同的。使用IP地址作为ID的网站有可能犯大错 - 你所举的例子很好,但他们经常失败。例如,我的办公室在英国,在另一个国家我们的主要IT设施的旁路点(我“出现”在互联网上的位置)上,所以从我的办公室看,我的IP地址似乎不在英国。因此,我无法访问只在英国的网络内容,如BBC iPlayer。在任何给定时间,我的公司可能有数百甚至数千人在使用相同的IP地址访问互联网。

当你编写服务器代码时,你永远不知道你所看到的IP地址指的到底是什么。有些用户喜欢这种情况。有些人故意使用代理或VPN来让您更糊涂。

当你说你的机器地址与StackOverflow上显示的IP地址不同,你是如何找到你的机器地址的?如果你只是本地使用ipconfig或类似软件来查看,我期望它会因我上面介绍的原因而不同。如果你想要验证外面的世界认为是什么,请参考whatismyipaddress.com/

这个NAT的维基百科链接会为你提供一些背景知识。

0
0 Comments

通常,您会想要知道访问您网站的人的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的博客文章“Gotcha:HTTP_X_FORWARD_FOR返回多个IP地址”

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

0