Search code examples
c#ip

What is the best way of validating an IP Address?


I have a method to validate a parameter IP Address. Being new to development as a whole I would like to know if there is a better way of doing this.

/// <summary>
/// Check IP Address, will accept 0.0.0.0 as a valid IP
/// </summary>
/// <param name="strIP"></param>
/// <returns></returns>
public bool CheckIPValid(string strIP)
{
    //  Split string by ".", check that array length is 3
    char chrFullStop = '.';
    string[] arrOctets = strIP.Split(chrFullStop);
    if (arrOctets.Length != 4)
    {
        return false;
    }
    //  Check each substring checking that the int value is less than 255 and that is char[] length is !> 2
    Int16 MAXVALUE = 255;
    Int32 temp; // Parse returns Int32
    foreach (string strOctet in arrOctets)
    {
        if (strOctet.Length > 3)
        {
            return false;
        }

        temp = int.Parse(strOctet);
        if (temp > MAXVALUE)
        {
            return false;
        }
    }
    return true;
}

Its simple (I could do it) but it seems to do the trick.


Solution

  • The limitation with IPAddress.TryParse method is that it verifies if a string could be converted to IP address, thus if it is supplied with a string value like "5", it consider it as "0.0.0.5".

    Another approach to validate an IPv4 could be following :

    public bool ValidateIPv4(string ipString)
    {
        if (String.IsNullOrWhiteSpace(ipString))
        {
            return false;
        }
    
        string[] splitValues = ipString.Split('.');
        if (splitValues.Length != 4)
        {
            return false;
        }
    
        byte tempForParsing;
    
        return splitValues.All(r => byte.TryParse(r, out tempForParsing));
    }
    

    It could be tested like:

    List<string> ipAddresses = new List<string>
    {
        "2",
        "1.2.3",
        "1.2.3.4",
        "255.256.267.300",
        "127.0.0.1",
    };
    foreach (var ip in ipAddresses)
    {
        Console.WriteLine($"{ip} ==> {ValidateIPv4(ip)}");
    }
    

    The output will be:

    2 ==> False
    1.2.3 ==> False
    1.2.3.4 ==> True
    255.256.267.300 ==> False
    127.0.0.1 ==> True
    

    You can also use IPAddress.TryParse but it has the limitations and could result in incorrect parsing.

    System.Net.IPAddress.TryParse Method

    Note that TryParse returns true if it parsed the input successfully, but that this does not necessarily mean that the resulting IP address is a valid one. Do not use this method to validate IP addresses.

    But this would work with normal string containing at least three dots. Something like:

    string addrString = "192.168.0.1";
    IPAddress address;
    if (IPAddress.TryParse(addrString, out address)) {
           //Valid IP, with address containing the IP
    } else {
           //Invalid IP
    }
    

    With IPAddress.TryParse you can check for existence of three dots and then call TryParse like:

    public static bool ValidateIPv4(string ipString)
    {
        if (ipString.Count(c => c == '.') != 3) return false;
        IPAddress address;
        return IPAddress.TryParse(ipString, out address);
    }