当前位置: 编程技术>.net/c#/asp.net
C#获取真实IP地址(IP转为长整形、判断是否内网IP的方法)
来源: 互联网 发布时间:2014-11-01
本文导语: 今天查看登录日志,发现http_x_forwarded_for获取到的ip地址有些是内网ip地址,有些则是公网和内网ip地址一起获取到,用逗号分隔开,日志截图如下: 之前获取ip地址的C#代码如下: 代码如下: /// /// C#获取客户端真实...
今天查看登录日志,发现http_x_forwarded_for获取到的ip地址有些是内网ip地址,有些则是公网和内网ip地址一起获取到,用逗号分隔开,日志截图如下:
之前获取ip地址的C#代码如下:
代码如下:
///
/// C#获取客户端真实IP地址
///
///
public static string GetIP()
{
string ip = HttpContext.Current.Request.ServerVariables["http_x_forwarded_for"];
if (UserCheck.IsNull(ip)) ip = HttpContext.Current.Request.ServerVariables["remote_addr"];
return ip;
}
看来http_x_forwarded_for应该是被其他软件或者ISP修改过了,导致http_x_forwarded_for得不到真实的代理ip地址。之前登陆日志是要判断ip地址是否在允许的ip段内的,这样导致无法登陆系统。最后修改代码如下,增加判断是否为内网或者私有地址,是否符合ipv4的地址规格,不符合还是使用remote_addr来获取客户端的ip地址。
比较安全的获取真实地址的实现代码:
代码如下:
///
/// C#将IP地址转为长整形
///
///
///
public static long IpToNumber(string ip)
{
string[] arr = ip.Split('.');
return 256 * 256 * 256 * long.Parse(arr[0]) + 256 * 256 * long.Parse(arr[1]) + 256 * long.Parse(arr[2]) + long.Parse(arr[3]);
}
///
/// C#判断IP地址是否为私有/内网ip地址
///
///
///
public static bool IsPrivateIp(string ip)
{
long ABegin = IpToNumber("10.0.0.0"), AEnd = IpToNumber("10.255.255.255"),//A类私有IP地址
BBegin = IpToNumber("172.16.0.0"), BEnd = IpToNumber("172.31.255.255"),//'B类私有IP地址
CBegin = IpToNumber("192.168.0.0"), CEnd = IpToNumber("192.168.255.255"),//'C类私有IP地址
IpNum = IpToNumber(ip);
return (ABegin