From 98641d49b85dd37019536811f3e3c6d22d8d33c3 Mon Sep 17 00:00:00 2001 From: ZacharyZcR Date: Wed, 21 Jan 2026 16:34:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(parsers):=20=E4=BF=AE=E5=A4=8D=E5=B8=A6?= =?UTF-8?q?=E6=A8=AA=E6=9D=A0=E5=9F=9F=E5=90=8D=E8=A2=AB=E8=AF=AF=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E4=B8=BAIP=E8=8C=83=E5=9B=B4=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 如 111-555.sss.com 这类域名因包含 - 被错误解析为 IP 范围, 添加 looksLikeIPRange() 检查,只有 - 前是有效 IP 才走范围解析 --- common/parsers/parse_test.go | 10 ++++++++++ common/parsers/parsers.go | 15 ++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/common/parsers/parse_test.go b/common/parsers/parse_test.go index 4a44d7b..7bcb66c 100644 --- a/common/parsers/parse_test.go +++ b/common/parsers/parse_test.go @@ -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 { diff --git a/common/parsers/parsers.go b/common/parsers/parsers.go index 537144b..eecb1cf 100644 --- a/common/parsers/parsers.go +++ b/common/parsers/parsers.go @@ -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, "-")