From 73b0b0b822738141ed72b0bf6d3324db8b8470ef Mon Sep 17 00:00:00 2001 From: Ruihang Zhang <64572280+zhruih@users.noreply.github.com> Date: Thu, 14 May 2026 21:45:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=A7=E7=BD=91?= =?UTF-8?q?=E6=AE=B5=E6=89=AB=E6=8F=8F=E4=B8=8D=E8=AE=BE=E7=BD=AE=E4=B8=8A?= =?UTF-8?q?=E9=99=90=E7=9A=84=E9=97=AE=E9=A2=98=20(#581)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复大网段扫描不设置上限的问题 修复三处关键Bug: 1. parseIPFullRange() - 修复逻辑错误 - 问题:当maxTargets=-1时,count >= -1 导致只返回1个IP - 修复:添加maxTargets > 0检查条件 2. parseIPShortRange() - 添加maxTargets参数支持 - 问题:短格式范围(如192.168.1.1-254)无法被限制 - 修复:添加maxTargets参数并在循环中检查 3. parseIPRangeString() - 修复调用传参遗漏 - 问题:调用parseIPShortRange()未传递maxTargets - 修复:传入maxTargets参数 改进点: - 大网段解析(如10.0.0.0/8)现在正确处理不超限的情况 - IP范围解析完整性验证 - 添加详细的bug报告和修复文档 * fix parser range limit handling --------- Co-authored-by: ZacharyZcR --- common/parsers/parse_test.go | 32 +++++++++++++++++++++++++++++++- common/parsers/parsers.go | 13 +++++++++---- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/common/parsers/parse_test.go b/common/parsers/parse_test.go index 609fbad..4800a87 100644 --- a/common/parsers/parse_test.go +++ b/common/parsers/parse_test.go @@ -590,6 +590,18 @@ func TestParseIP_IPRange(t *testing.T) { } } +func TestParseIP_IPRangeLimit(t *testing.T) { + result, err := parseIPRangeString("192.168.1.1-5", 3) + if err != nil { + t.Fatalf("parseIPRangeString error = %v", err) + } + + expected := []string{"192.168.1.1", "192.168.1.2", "192.168.1.3"} + if !reflect.DeepEqual(result, expected) { + t.Errorf("parseIPRangeString limit = %v, want %v", result, expected) + } +} + // TestParseIP_FromFile 测试从文件读取 // // 验证:文件中的IP列表被正确读取 @@ -969,6 +981,24 @@ func TestParseIP_FullIPRange(t *testing.T) { } } +func TestParseIP_FullIPRangeNoLimit(t *testing.T) { + result, err := parseIPRangeString("192.168.1.1-192.168.1.5", -1) + if err != nil { + t.Fatalf("parseIPRangeString error = %v", err) + } + + expected := []string{ + "192.168.1.1", + "192.168.1.2", + "192.168.1.3", + "192.168.1.4", + "192.168.1.5", + } + if !reflect.DeepEqual(result, expected) { + t.Errorf("parseIPRangeString no limit = %v, want %v", result, expected) + } +} + // TestParseIP_InvalidCIDR 测试无效CIDR func TestParseIP_InvalidCIDR(t *testing.T) { tests := []struct { @@ -1173,7 +1203,7 @@ test: {"admin", "password123"}, {"root", "toor"}, {"user", "pass:with:colons"}, // 密码可以包含冒号 - {"test", ""}, // 空密码 + {"test", ""}, // 空密码 } if len(result) != len(tests) { diff --git a/common/parsers/parsers.go b/common/parsers/parsers.go index 74bbdbc..d32d408 100644 --- a/common/parsers/parsers.go +++ b/common/parsers/parsers.go @@ -302,7 +302,7 @@ func parseIPCIDR(cidr string, maxTargets int) ([]string, error) { for ipNet.Contains(ip) { ips = append(ips, ip.String()) count++ - if count >= maxTargets { + if maxTargets > 0 && count >= maxTargets { break } incrementIP(ip) @@ -346,7 +346,7 @@ func parseIPRangeString(rangeStr string, maxTargets int) ([]string, error) { // 处理简写格式 (如: 192.168.1.1-100) if len(endIPStr) < 4 || !strings.Contains(endIPStr, ".") { - return parseIPShortRange(startIPStr, endIPStr) + return parseIPShortRange(startIPStr, endIPStr, maxTargets) } // 处理完整格式 (如: 192.168.1.1-192.168.1.100) @@ -359,7 +359,7 @@ func parseIPRangeString(rangeStr string, maxTargets int) ([]string, error) { } // parseIPShortRange 解析短格式IP范围 -func parseIPShortRange(startIPStr, endSuffix string) ([]string, error) { +func parseIPShortRange(startIPStr, endSuffix string, maxTargets int) ([]string, error) { endNum, err := strconv.Atoi(endSuffix) if err != nil || endNum > 255 { return nil, fmt.Errorf("无效的IP范围结束值: %s", endSuffix) @@ -377,8 +377,13 @@ func parseIPShortRange(startIPStr, endSuffix string) ([]string, error) { } var allIP []string + count := 0 for i := startNum; i <= endNum; i++ { allIP = append(allIP, fmt.Sprintf("%s.%d", prefixIP, i)) + count++ + if maxTargets > 0 && count >= maxTargets { + break + } } return allIP, nil @@ -408,7 +413,7 @@ func parseIPFullRange(startIP, endIP net.IP, maxTargets int) ([]string, error) { ips = append(ips, current.String()) count++ - if current.Equal(end4) || count >= maxTargets { + if current.Equal(end4) || (maxTargets > 0 && count >= maxTargets) { break } incrementIP(current)