【问题标题】:Error validating ipv6 address .Net验证 ipv6 地址时出错.Net
【发布时间】:2018-08-23 13:38:22
【问题描述】:
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 时显示无效

【问题讨论】:

    标签: .net ipv6


    【解决方案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 对地址的验证对您来说不够严格,这将增加强制特定格式的灵活性。

    【讨论】:

    • 但是如果我不使用它,那么当我尝试验证 Ipv4 地址测试值“153”时它会显示错误的结果。它正在将其转换为 0.0.0.153 并将其标记为写入 ipv4 地址。
    • @AshuGarg:但是153 一个有效的 IPv4 地址,通常也可以写成一个整数。例如,Google 的公共 DNS 服务器的地址为 8.8.8.8134744072。两者都应该在大多数应用程序中工作。如果您想防止 integers 被视为有效 IP 地址,那么也许您应该检查代表整数的字符串 also 并在这种情况下拒绝。或者,您可以仅将该检查添加到 IPv4 switch 案例:case AddressFamily.InterNetworkV4: return !int.TryParse(ipAddress, out int dummy);
    • @AshuGarg:我建议您尝试找出您想要接受和拒绝的确切格式,并确定合适的算法来执行此操作。当然,您的要求与 IPAddress 可以解析的不同肯定是有原因的。这也意味着您不能真正使用这种验证地址的方式。您可以添加一个正则表达式验证来检查一般格式是否是您预期的格式,并仅使用 IPAddress 来验证地址实际上是否有效。
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 2015-11-26
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    相关资源
    最近更新 更多