fix(parsers): 修复带横杠域名被误识别为IP范围的问题

如 111-555.sss.com 这类域名因包含 - 被错误解析为 IP 范围,
添加 looksLikeIPRange() 检查,只有 - 前是有效 IP 才走范围解析
This commit is contained in:
ZacharyZcR
2026-01-21 16:34:07 +08:00
parent 80f16fe039
commit 98641d49b8
2 changed files with 24 additions and 1 deletions
+10
View File
@@ -444,6 +444,16 @@ func TestParseIP_SingleIP(t *testing.T) {
"example.com",
[]string{"example.com"},
},
{
"带横杠的域名",
"111-555.sss.com",
[]string{"111-555.sss.com"},
},
{
"多段横杠域名",
"my-test-server.example.com",
[]string{"my-test-server.example.com"},
},
}
for _, tt := range tests {
+14 -1
View File
@@ -112,7 +112,7 @@ func parseHostString(host string) ([]string, error) {
return nil, fmt.Errorf("CIDR解析失败 %s: %w", h, err)
}
hosts = append(hosts, cidrHosts...)
case strings.Contains(h, "-") && !strings.Contains(h, ":"):
case strings.Contains(h, "-") && !strings.Contains(h, ":") && looksLikeIPRange(h):
rangeHosts, err := parseIPRangeString(h, SimpleMaxHosts)
if err != nil {
return nil, fmt.Errorf("IP范围解析失败 %s: %w", h, err)
@@ -316,6 +316,19 @@ func parseIPCIDR(cidr string, maxTargets int) ([]string, error) {
return ips, nil
}
// looksLikeIPRange 检查字符串是否像IP范围格式
// 如 192.168.1.1-100 或 192.168.1.1-192.168.1.100
// 而不是像 111-555.sss.com 这种域名
func looksLikeIPRange(s string) bool {
idx := strings.Index(s, "-")
if idx == -1 {
return false
}
// 检查 - 前面的部分是否是有效IP
startPart := s[:idx]
return net.ParseIP(startPart) != nil
}
// parseIPRangeString 解析IP范围字符串
func parseIPRangeString(rangeStr string, maxTargets int) ([]string, error) {
parts := strings.Split(rangeStr, "-")