国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#獲取真實IP地址(IP轉為長整形、判斷是否內網IP的方法)

2020-01-24 02:34:10
字體:
來源:轉載
供稿:網友

今天查看登錄日志,發現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下獲取第一個項。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金塔县| 黄梅县| 东乡| 吴川市| 淮安市| 荆门市| 阳西县| 若羌县| 汉阴县| 济宁市| 苏州市| 米林县| 望江县| 弥勒县| 商洛市| 察隅县| 屏东市| 曲松县| 鲜城| 江陵县| 兴业县| 兴海县| 江川县| 田东县| 武宁县| 安阳县| 邵东县| 鹰潭市| 新平| 镇康县| 吴江市| 德庆县| 林甸县| 凤庆县| 黔南| 阿荣旗| 灵丘县| 呼和浩特市| 安平县| 确山县| 郑州市|