如何从HTTP头中获取客户端的IP地址?

30 浏览
0 Comments

如何从HTTP头中获取客户端的IP地址?

我知道查看这两个变量是一种标准做法。当然,它们很容易被伪造。我想知道你能期望这些值(尤其是HTTP_X_FORWARDED_FOR)多久能包含真实信息,而不只是乱码或被删除数值?

有没有经验或统计数据关于这方面的内容?

还有什么其他方法可以获取客户端的IP地址?

0
0 Comments

从上面的内容可以看出,问题的出现原因是希望从HTTP头部获取客户端的IP地址。解决方法是使用提供的ASP.Net静态方法,通过遍历请求的HTTP头部,查找特定的键值对来获取客户端的IP地址。该方法还提供了跳过私有IP范围的选项。

首先,定义了一个名为ClientIP的静态类,其中包含了一个名为ClientIPFromRequest的扩展方法,用于从请求的HTTP头部获取客户端IP地址。该方法遍历了一个名为s_HeaderItems的列表,该列表中包含了需要检查的HTTP头部键值对。对于每个键值对,首先获取对应的IP字符串,然后根据是否需要拆分进行处理。如果需要拆分,则将IP字符串按逗号分隔,并逐个检查每个分隔后的IP地址是否为有效的IP地址,并且可选择跳过私有IP范围。如果不需要拆分,则直接检查IP字符串是否为有效的IP地址,并可选择跳过私有IP范围。如果所有的检查都不满足,则返回请求的UserHostAddress。

其次,定义了一个名为ValidIP的私有静态方法,用于检查IP地址是否为有效的IP地址,并可选择跳过私有IP范围。该方法首先将IP字符串进行修剪和判断,然后尝试解析为IPAddress类型的IP地址。如果解析失败,或者解析出的IP地址不是IPv4或IPv6地址,则返回false。如果需要跳过私有IP范围,并且解析出的IP地址是IPv4地址,则将IP地址转换为UInt64类型的值,并遍历私有IP范围数组,判断该IP地址是否在私有IP范围内。如果在范围内,则返回false。否则,返回true。

接下来,定义了一个名为IpRange的私有封闭类,用于描述和比较IP地址范围。该类包含了一个构造函数用于初始化起始和结束IP地址,以及一些用于转换和比较IP地址的方法。其中,AddrToUInt64方法用于将IPAddress类型的IP地址转换为UInt64类型的值,ParseToUInt64方法用于将字符串类型的IP地址解析为UInt64类型的值,Encompasses方法用于判断指定的UInt64类型的IP地址值是否在范围内,Encompasses方法还重载了一个接受IPAddress类型参数的版本,用于将IPAddress类型的IP地址转换为UInt64类型的值后再进行比较。

最后,定义了一个名为s_PrivateRanges的私有静态IpRange数组,用于存储需要跳过的私有IP范围。该数组中包含了多个IpRange对象,每个对象表示一个私有IP范围。

以上就是从给定的内容中整理出的关于如何从HTTP头部获取客户端IP地址的问题的出现原因和解决方法。

0
0 Comments

如何从HTTP头中获取客户端的IP地址?

在除了REMOTE_ADDRHTTP_X_FORWARDED_FOR之外还有一些其他可以设置的头部,如:

  • HTTP_CLIENT_IP
  • HTTP_X_FORWARDED_FOR可以是逗号分隔的IP列表
  • HTTP_X_FORWARDED
  • HTTP_X_CLUSTER_CLIENT_IP
  • HTTP_FORWARDED_FOR
  • HTTP_FORWARDED

我在以下网站找到了有用的代码:

http://www.grantburton.com/?p=97

这个列表是否完整,是否覆盖了90%以上的代理?

我认为这些头部不应该有HTTP_前缀...经过一番搜索,我找到了stackoverflow.com/questions/3834083/…

现在还有一个Referer,根据RFC 7239

0
0 Comments

问题的出现原因是因为需要从HTTP头部获取客户端的IP地址。在某些网站中,IP跟踪非常重要,而在合作伙伴网站中,有20%至40%的请求要么是伪造的IP地址,要么是头部信息被清空的,这取决于时间和请求的来源。对于通过自然流量获取访问量的网站,我预计良好的IP地址比例会更高。

解决方法是小心处理获取到的IP地址,因为IP地址并不是一种可靠的唯一访问者识别方式。

0