fix: 修复大网段扫描不设置上限的问题 (#581)
测试构建 / 代码检查 (push) Has been cancelled
测试构建 / 单元测试和构建 (push) Has been cancelled
测试构建 / 构建验证 (push) Has been cancelled

* 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 <[email protected]>
This commit is contained in:
Ruihang Zhang
2026-05-14 21:45:42 +08:00
committed by GitHub
co-authored by ZacharyZcR
parent d412786228
commit 73b0b0b822
2 changed files with 40 additions and 5 deletions
+31 -1
View File
@@ -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) {
+9 -4
View File
@@ -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)