IPAddress.TryParse解析带前导零IP返回错误地址是否为正常行为?
关于IPAddress.TryParse解析带前导零IP段的行为说明
这个行为是方法的既定设计表现,不属于解析错误。
- 该方法的IPv4解析逻辑兼容传统
inet_aton函数的解析规则,并非强制要求所有地址段按十进制解析:- 地址段以
0为前缀时,按八进制规则解析数值 - 地址段以
0x为前缀时,按十六进制规则解析数值 - 没有特殊前缀的地址段,才会按常规十进制规则解析
测试用例中的010作为八进制数转换为十进制结果为8,000转换为十进制为0,因此最终解析得到的IP地址为8.0.0.8,和实际观测结果完全匹配。
当输入字符串改为"10.0.0.10"时,所有地址段都没有特殊前缀,方法会按十进制规则解析,自然能得到预期的10.0.0.10结果。
- 地址段以
风险提示:这个隐式解析规则很容易引发隐蔽问题,比如IP白名单校验、IP字符串匹配场景下,带前导零的输入可能绕过校验规则,出现和业务预期不符的解析结果。如果业务要求必须严格按十进制解析所有IP段,需要先对输入的IP字符串做预处理,移除每个地址段的前导零后再调用解析方法,也可以自行实现严格的十进制分段解析校验逻辑。
复现该行为的测试代码如下:
string addrStr = "010.000.000.010"; bool parsed = IPAddress.TryParse(addrStr,out IPAddress addr);
内容的提问来源于stack exchange,提问作者Doug Havenhill
相关产品推荐
相关产品推荐

