首页 新闻 会员 周边

获取的ip地址有逗号

0
[已解决问题] 解决于 2016-08-26 21:47

项目中有个获取ip地址的地方,然后拿ip地址去查城市,今天突然报错了,同事们查了好久查到了个,看上去很不正常的ip地址。发现是ip地址有逗号。很是迷茫这是怎么回事?

为什么ip地址会长成这个样子?

asp.net获取用户ip地址有逗号。

ip长的如下面这个样子。请高手解答这是怎么回事?

117.136.60.24, 183.2

荆棘人的主页 荆棘人 | 菜鸟二级 | 园豆:410
提问于:2015-12-05 16:10
< >
分享
最佳答案
1

117.136.61.26, 183.2        经过检查,是因为数据库ip地址的长度是 varhcar(20)   数据库把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下获取第一个项。

 

参考网址: http://www.jb51.net/article/53376.htm

 
荆棘人 | 菜鸟二级 |园豆:410 | 2015-12-05 16:45
其他回答(1)
1

不用担心不是太大的问题

厚学网Nimxuer | 园豆:217 (菜鸟二级) | 2015-12-07 16:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册