源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C#获取真实IP地址(IP转为长整形、判断是否内网IP的方法)

  • 时间:2021-09-27 00:45 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C#获取真实IP地址(IP转为长整形、判断是否内网IP的方法)
今天查看登录日志,发现http_x_forwarded_for获取到的ip地址有些是内网ip地址,有些则是公网和内网ip地址一起获取到,用逗号分隔开,日志截图如下: [img]http://files.jb51.net/file_images/article/201408/201487111936929.jpg?201477111944[/img] [b]之前获取ip地址的C#代码如下:[/b]
[u]复制代码[/u] 代码如下:
    /// <summary>     /// C#获取客户端真实IP地址     /// </summary>     /// <returns></returns>     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地址。 [b]比较安全的获取真实地址的实现代码:[/b]
[u]复制代码[/u] 代码如下:
 /// <summary>     /// C#将IP地址转为长整形     /// </summary>     /// <param name="ip"></param>     /// <returns></returns>     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]);     }     /// <summary>     /// C#判断IP地址是否为私有/内网ip地址     /// </summary>     /// <param name="ip"></param>     /// <returns></returns>     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 <= IpNum && IpNum <= AEnd) || (BBegin <= IpNum && IpNum <= BEnd) || (CBegin <= IpNum && IpNum <= CEnd);     }     /// <summary>     /// C#获取真实IP地址     /// </summary>     /// <returns></returns>     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"];         else//代理ip地址有内容,判断是否符合ipv4地址或者是否为内网地址         {             ip = ip.Trim().Replace(" ", "");             if (!Regex.IsMatch(ip, @"^\d+(\.\d+){3}$") || IsPrivateIp(ip))                 ip = HttpContext.Current.Request.ServerVariables["remote_addr"];//不符合规则或者内网/私有地址使用remote_addr代替         }         return ip;     }
2014-07-02更新:原来是 cdn加速的问题,cdn加速后,由于先判断http_x_forwarded_for,http_x_forwarded_for是随便可以伪造的,放置任何内容的,所以下图出现的ip地址中会有内网地址或者出现2个ip地址的问题。所以获取http_x_forwarded_for内容时需要 split下获取第一个项。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部