验证IP地址的最佳方法是什么?

Ste*_*rby 38 c# ip

我有一个方法来验证参数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;
}
Run Code Online (Sandbox Code Playgroud)

它很简单(我可以做到),但它似乎做了伎俩.

Hab*_*bib 83

所述限制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));
}
Run Code Online (Sandbox Code Playgroud)

它可以测试如下:

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)}");
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

2 ==> False
1.2.3 ==> False
1.2.3.4 ==> True
255.256.267.300 ==> False
127.0.0.1 ==> True
Run Code Online (Sandbox Code Playgroud)

您也可以使用,IPAddress.TryParse但它有局限性,可能导致解析不正确.

System.Net.IPAddress.TryParse方法

请注意,如果TryParse成功解析输入,则返回true,但这并不一定意味着生成的IP地址是有效的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
}
Run Code Online (Sandbox Code Playgroud)

随着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);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果添加`,[`IPAddress.TryParse`](https://msdn.microsoft.com/en-us/library/system.net.ipaddress.tryparse(v = vs.110).aspx)可能更容易使用&& address.ToString()== ipString`到它.那么你不应该计算点数.它可能适用于IPv4和IPv6. (5认同)
  • 如上所述使用的IPAddress.TryParse将某些字符串声明为有效,在其他情况下,0.0.0.0被成功验证,对于大多数用途可能是不可取的. (3认同)

M A*_*ifi 13

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

你完成了

编辑1

添加了一些额外的检查以防止抛出异常(这是很昂贵的).PS它不会处理unicode.

编辑2

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

  1. 该字符串为null.
  2. 该字符串包含unicode字符.

由您决定(设计决策)是否要抛出异常或返回false.在解析时,我通常更喜欢返回false而不是异常(假设这是输入不保证是正确的).

我说,打破退货声明,

  1. 该字符串不为null(也不为空,无论如何都不会解析)AND
  2. IP地址正确解析.

记住C#布尔表达式是惰性求值的,因此如果字符串为null空或者为空,CLR将不会尝试解析该字符串.

关于失踪的if,你可以做点什么,

if (IP.TryParse(strIP, out result)
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但你真正在做的就是说如果事情是真的,那就回归真实.更容易直接返回表达式.


GGO*_*GGO 12

最好的正则表达式解决方案(对 MVC DataAnnotations 有用):

^((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]?)$
Run Code Online (Sandbox Code Playgroud)

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]?)$")
Run Code Online (Sandbox Code Playgroud)


Adi*_*dil 5

为什么不使用IPAddress.ParseIPAddress.TryParse

IPAddress.Parse(stringVarialbeContainingIP)
Run Code Online (Sandbox Code Playgroud)


Yia*_*sis 5

不使用IPAddress类并针对字节进行验证,这比Int <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;
    }
Run Code Online (Sandbox Code Playgroud)