什么是验证一个IP地址的最佳方式?(What is the best way of validati

2019-06-26 03:52发布

我要验证参数IP地址的方法。 作为新的发展作为一个整体,我想知道是否有这样做的更好的方法。

/// <summary>
/// Check IP Address, will accept 0.0.0.0 as a valid IP
/// </summary>
/// <param name="strIP"></param>
/// <returns></returns>
public Boolean 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;
}

其简单的(我能做到这一点),但似乎这样的伎俩。

Answer 1:

限制 IPAddress.TryParse方法是,它验证是否字符串可能被转换成IP地址,因此,如果它与像一个字符串值提供"5" ,它把它看成"0.0.0.5"

验证IPv4的另一种方法可能是以下几点:

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));
}

它可以测试,如:

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)}");
}

输出将是:

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

您还可以使用IPAddress.TryParse但它有限制,并可能导致不正确的解析。

System.Net.IPAddress.TryParse方法

需要注意的是如果的TryParse它成功地解析输入返回true,但是,这并不一定意味着最终得到的IP地址是有效的。 不要使用此方法来验证IP地址。

但是,这将与至少包含三个点正常的字符串工作。 就像是:

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

随着IPAddress.TryParse您可以检查三个点的存在,然后调用TryParse这样的:

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


Answer 2:

using System.Net;
public static bool CheckIPValid(string strIP)
{
    IPAddress result = null;
    return
        !String.IsNullOrEmpty(strIP) &&
        IPAddress.TryParse(strIP, out result);
}

就大功告成

编辑1

增加了一些额外的检查,以防止异常被抛出(这是昂贵的)。 PS也不会处理二进制。

编辑2

@StephenMurby IPAddress.TryParse如果它成功地解析字符串将返回true。 如果您检查文件的方法,但它会在两种情况下抛出异常。

  1. 该字符串为空。
  2. 该字符串包含Unicode字符。

它由你来决定(设计决定)是否要抛出异常或返回false。 当谈到解析我一般喜欢返回false,而不是例外(假设是这是不能保证是正确的输入)。

打破return语句了,我是说,

  1. 该字符串不为空(也空,不会反正解析)AND
  2. IP地址正确分析。

记住C#的布尔表达式是懒惰的评价 ,所以CLR不会尝试甚至解析字符串,如果它是null或空。

关于如果丢失,你可以这样做,

if (IP.TryParse(strIP, out result)
{
    return true;
}

但是,你真正做的是说,如果事情是真实的,返回true。 容易只是返回表达立竿见影。



Answer 3:

你为什么不使用IPAddress.Parse或IPAddress.TryParse

IPAddress.Parse(stringVarialbeContainingIP)


Answer 4:

该框架提供的IPAddress类这反过来又为您提供的ParseTryParse方法。

// myAddress is a System.Net.IPAddress instance
if (System.Net.IPAddress.TryParse(strIP , out myAddress)) 
    // IP is valid
else
    // IP isn't valid


Answer 5:

如果不使用ip地址类和验证针对字节,这远远高于诠释<256办法更好。

    public Boolean CheckIPValid(String strIP)
    {
        //  Split string by ".", check that array length is 4
        string[] arrOctets = strIP.Split('.');
        if (arrOctets.Length != 4)
            return false;

        //Check each substring checking that parses to byte
        byte obyte = 0;
        foreach (string strOctet in arrOctets)
            if (!byte.TryParse(strOctet, out obyte)) 
                return false;

        return true;
    }


Answer 6:

最好的正则表达式的解决方案:

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

C#

Regex.IsMatch(value, "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")


Answer 7:

没有人感到惊讶提供了一个正则表达式的解决方案。 所有你需要的是包括System.Text.RegularExpressions。 对于无论是在实际的代码和这个例子的可读性,我总是块我的正则表达式转换成字符串数组,然后加入。

        // Any IP Address
        var Value = "192.168.0.55"; 
        var Pattern = new string[]
        {
            "^",                                            // Start of string
            @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.",    // Between 000 and 255 and "."
            @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.",
            @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.",
            @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])",      // Same as before, no period
            "$",                                            // End of string
        };

        // Evaluates to true 
        var Match = Regex.IsMatch(Value, string.Join(string.Empty, Pattern));


Answer 8:

试试这个:

private bool IsValidIP(String ip)
    {
        try
        {
            if (ip == null || ip.Length == 0)
            {
                return false;
            }

            String[] parts = ip.Split(new[] { "." }, StringSplitOptions.None);
            if (parts.Length != 4)
            {
                return false;
            }

            foreach (String s in parts)
            {
                int i = Int32.Parse(s);
                if ((i < 0) || (i > 255))
                {
                    return false;
                }
            }
            if (ip.EndsWith("."))
            {
                return false;
            }

            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }


Answer 9:

如果你想只检查是否是有效只做:

bool isValid = IPAddress.TryParse(stringIP, out IPAddress _);

它将有效的,即使这是上面255,如果有点数,所以没必要去检查一下。



Answer 10:

您可以处理这样说,这是IPv4或IPv6的:

    public static string CheckIPValid(string strIP)
    {
        //IPAddress result = null;
        //return !String.IsNullOrEmpty(strIP) && IPAddress.TryParse(strIP, out result);
        IPAddress address;
        if (IPAddress.TryParse(strIP, out address))
        {
            switch (address.AddressFamily)
            {
                case System.Net.Sockets.AddressFamily.InterNetwork:
                    // we have IPv4
                    return "ipv4";
                //break;
                case System.Net.Sockets.AddressFamily.InterNetworkV6:
                    // we have IPv6
                    return "ipv6";
                //break;
                default:
                    // umm... yeah... I'm going to need to take your red packet and...
                    return null;
                    //break;
            }
        }
        return null;
    }


文章来源: What is the best way of validating an IP Address?
标签: c# ip