验证ipv6地址.Net时出错

时间:2018-08-23 13:38:22

标签: .net ipv6

private bool ValidateIpAddress(string ipAddress)
    {
        if (IPAddress.TryParse(ipAddress, out IPAddress address) && address.ToString()==ipAddress)
        {
            switch (address.AddressFamily)
            {
                case System.Net.Sockets.AddressFamily.InterNetwork:
                    return true;
                case System.Net.Sockets.AddressFamily.InterNetworkV6:
                    return true;
            }
        }
        return false;
    }

我正在使用此方法验证我的字符串是否为ipv4或ipv6地址,但在测试-2001:0db8:85a3:0000:0000:8a2e:0370:7334时显示无效

1 个答案:

答案 0 :(得分:1)

这是因为您检查IP地址的字符串表示形式是否与您输入的内容相同:

if (... && address.ToString()==ipAddress)

可以正确解析有问题的地址,但可以将其写为缩写形式,但是以下两个字符串不相等:

  • 2001:0db8:85a3:0000:0000:8a2e:0370:7334
  • 2001:db8:85a3::8a2e:370:7334

我还要指出,大写与十六进制表示形式无关,因此至少应进行不区分大小写的比较。但是总的来说,我可能会放弃字符串必须匹配的要求(如果您已经确定字符串 是有效的IP地址,为什么必须这样做?)。如果绝对必须保留该要求,则可能必须手动将地址转换为所需的格式。

编辑:显然,您的IPv4地址必须具有特定的格式,因此您还可以通过正则表达式来验证常规结构:

var regex = @"(?ix)
              ^\d+(\.\d+){3}$ # IPv4 address with all four octets
              |
              ^[0-9a-f]{4}(:[0-9a-f]{4}){7}$ # IPv6 address without any shortening";
if (... && Regex.IsMatch(ipAddress, regex))

现在,虽然这是蠕虫的另一种形式,但是由于IPAddress对地址的验证对您来说还不够严格,因此这将增加强制特定格式的灵活性。