檢查是否為私有ip

有很多的時候我們需要檢查ip是否為私有ip, 例如在登入系統時需要限制區網內的電腦才能登入, 或是在用
Google Analytics時要排除區網的流量記錄等等. 檢查的方式有2種, 一種是用Regular expression來做,
而我們要做的是另一種就是用土法煉鋼的方式來做.

在寫檢查函式前我們要先了解私有ip的範圍為何

私有ip的範圍
10.0.0.0 - 10.255.255.255    
172.16.0.0 - 172.31.255.255  
192.168.0.0 - 192.168.255.255
了解了ip範圍後, 我們首先把ip分解成陣列然後得到4組數字, 接著建立4個legit0~3的bool變數, 這些變數會用來決定
要判斷的ip是否為私有ip.

接著我們依序去檢查上述的ip範圍, 如第1組數字為10的, 我們就接著判斷第2組數字是否在0~255的範圍內, 後面的第3組
及第4組數字也是做一樣的判斷, 最後再檢查legit0~3的結果是否都為true, 如果是的話就表示此ip為私有ip, 若為否
則不是私有ip.

私有ip檢查函式
public bool CheckPrivateIP(string ip)
{
    string[] arrIP;
    List<int> arrNumIP = new List<int>(0);
    bool legit0 = false, legit1 = false, legit2 = false, legit3 = false;
    bool result = true;
    
    arrIP = ip.Split(new string[] { "." }, StringSplitOptions.None);
    for (int i = 0; i < arrIP.Length; i++)
    {
        arrNumIP.Add(int.Parse(arrIP[i]));
    }

    if (arrNumIP[0] == 10)
    {
        legit0 = true;
        if (arrNumIP[1] >= 0 && arrNumIP[1] <= 255) { legit1 = true; }
        if (arrNumIP[2] >= 0 && arrNumIP[2] <= 255) { legit2 = true; }
        if (arrNumIP[3] >= 0 && arrNumIP[3] <= 255) { legit3 = true; }
    }
    else if (arrNumIP[0] == 172)
    {
        legit0 = true;
        if (arrNumIP[1] >= 16 && arrNumIP[1] <= 31) { legit1 = true; }
        if (arrNumIP[2] >= 0 && arrNumIP[2] <= 255) { legit2 = true; }
        if (arrNumIP[3] >= 0 && arrNumIP[3] <= 255) { legit3 = true; }
    }
    else if (arrNumIP[0] == 192)
    {
        legit0 = true;
        if (arrNumIP[1] == 168) { legit1 = true; }
        if (arrNumIP[2] >= 0 && arrNumIP[2] <= 255) { legit2 = true; }
        if (arrNumIP[3] >= 0 && arrNumIP[3] <= 255) { legit3 = true; }
    }

    if (!legit0 || !legit1 || !legit2 || !legit3) { result = false; }

    return result;
}

 
comments powered by Disqus