当前位置: 首页 > 编程笔记 >

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

宗乐池
2023-03-14
本文向大家介绍C#获取真实IP地址(IP转为长整形、判断是否内网IP的方法),包括了C#获取真实IP地址(IP转为长整形、判断是否内网IP的方法)的使用技巧和注意事项,需要的朋友参考一下

今天查看登录日志,发现http_x_forwarded_for获取到的ip地址有些是内网ip地址,有些则是公网和内网ip地址一起获取到,用逗号分隔开,日志截图如下:

之前获取ip地址的C#代码如下:


    /// <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地址。

比较安全的获取真实地址的实现代码:


 /// <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下获取第一个项。

 类似资料:
  • 本文向大家介绍Java判断IP地址为内网IP还是公网IP的方法,包括了Java判断IP地址为内网IP还是公网IP的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java判断IP地址为内网IP还是公网IP的方法。分享给大家供大家参考。具体分析如下: tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下: 10.0.0.0/8:10.0.0.0~10.255.255

  • 本文向大家介绍C# 获取IP及判断IP是否在区间,包括了C# 获取IP及判断IP是否在区间的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看代码: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 本文向大家介绍C#判断ip地址是否可以ping的通,包括了C#判断ip地址是否可以ping的通的使用技巧和注意事项,需要的朋友参考一下

  • 本文向大家介绍python IP地址转整数,包括了python IP地址转整数的使用技巧和注意事项,需要的朋友参考一下 背景 今天有人问我 “为什么数据库中有人推荐使用 int 类型来保存 IP 地址?”。现在(2020年)来看这个东西已经有点过时了,一方面是磁盘空间不在那么贵,另一方面是 IPv6 与这条法则不兼容。 下面我们就来看一下把 IPv4 地址转换成整数的原理和收益各是什么。 转换的原

  • 本文向大家介绍Android 获取IP地址的实现方法,包括了Android 获取IP地址的实现方法的使用技巧和注意事项,需要的朋友参考一下 Android 获取IP地址 最近做项目,有一个需求是Android设备获取当前IP的功能,经过一番查询资料解决了,记录下实现方法。 1.使用WIFI 首先设置用户权限 其次,代码如下 2.使用GPRS 首先,设置用户上网权限 <uses-permission

  • 本文向大家介绍asp实现检查ip地址是否为内网或者私有ip地址的代码分享,包括了asp实现检查ip地址是否为内网或者私有ip地址的代码分享的使用技巧和注意事项,需要的朋友参考一下 asp检查ip地址是否为私有/内网ip地址源代码。 内网/私有IP地址网段如下,还有127开头的回环地址: 10.0.0.0-10.255.255.255 172.16.0.0—172.31.255.255 192.16