为啥 IPAddress.TryParse 允许“]”之后的任何内容

Posted

技术标签:

【中文标题】为啥 IPAddress.TryParse 允许“]”之后的任何内容【英文标题】:Why does IPAddress.TryParse allow anything after a ']'为什么 IPAddress.TryParse 允许“]”之后的任何内容 【发布时间】:2010-05-14 16:11:05 【问题描述】:

我想使用 System.Net.IPAddress.TryParse 来验证 IPv6 地址,因为我不想编写自己的 reg exp :-)

但是,这似乎允许诸如“(validIPv6)](anythingatallhere)”之类的字符串 - 例如,“1234::5678:abcd]whargarbl”。

这些是否有效,或者这是一个错误?

由于我实际上只想要“[(validIPv6)]:(portnumber)”形式的字符串,因此我必须自己进行一些验证。

【问题讨论】:

System.Net.IPAddress.Parse("1234::5678:abcd]whargarbl") 对我来说失败了。请记住,当使用 try parse 时,它​​不会抛出 except 而是将 out 参数保留为默认值 什么版本的 Windows? used2could:该字符串为我传递 - TryParse 返回 True,并且 IPAddress 具有例如AddressFamily 设置为 InterNetworkV6 和 ToString() 值“1234:0000:0000:0000:0000:0000:86.120.171.205”。 SLaks - 这是 XP,我猜它实际上并不支持 IPv6。 【参考方案1】:

我正在查看反射器,似乎如果您当前的操作系统不支持 IPV6,则会调用一个解析例程,该例程将忽略最后一个 ']' 字符之后的所有内容。

这似乎是有问题的代码,请注意第二个或条件,因为它与前面的代码位相关。

int length = ipString.Length;
fixed (char* str2 = ((char*) ipString))

    char* name = str2;
    if (IPv6AddressHelper.IsValid(name, start, ref length) || (length != ipString.Length))

【讨论】:

你能多发一点吗?我实在想不通。或者你不认为其余的会有帮助吗?看起来 IsValid 要么改变 ipString(通过 str2 和名称)或长度......所以如果整个字符串有效则返回 true,或者如果子字符串有效则改变字符串/长度? @Rawling - 你的理论与我收集到的相似,所以发布更多代码可能不会有什么不同,反正代码太多了。 这里也引用了:social.msdn.microsoft.com/Forums/en/ncl/thread/… 所以基本上,它有点坏了。意识到我实际上不需要使用正则表达式后,我很想编写自己的验证代码,要么自己处理方括号并将其余部分传递给库,要么只使用 Split 等来验证它完全是我自己。

以上是关于为啥 IPAddress.TryParse 允许“]”之后的任何内容的主要内容,如果未能解决你的问题,请参考以下文章

验证字符串是不是对 IP 地址有效

为啥 SQL Server GEOGRAPHY 允许 -15069° 和 +15069° 之间的经度?为啥是±15069°?

为啥不允许方法?

为啥 curl 允许使用文件 URL 方案,但不允许使用 wget

为啥 WCF 中不允许方法重载?

为啥不允许样式表列?