@@ -2,6 +2,8 @@ package cmd
22
33import (
44 "fmt"
5+ "net"
6+ "regexp"
57 "strings"
68
79 "RealityChecker/internal/ui"
@@ -10,9 +12,20 @@ import (
1012// executeBatch 执行批量检测
1113func (r * RootCmd ) executeBatch (domainsStr string ) {
1214 // 解析域名列表
13- domains := parseDomains (domainsStr )
15+ domains , invalidDomains := parseDomains (domainsStr )
16+
17+ // 显示无效域名警告
18+ if len (invalidDomains ) > 0 {
19+ fmt .Printf ("警告:发现 %d 个无效域名,已跳过:\n " , len (invalidDomains ))
20+ for _ , domain := range invalidDomains {
21+ fmt .Printf (" - %s\n " , domain )
22+ }
23+ fmt .Println ()
24+ }
25+
1426 if len (domains ) == 0 {
15- fmt .Println ("没有有效的域名" )
27+ fmt .Println ("错误:没有有效的域名可以检测" )
28+ fmt .Println ("提示:请检查域名格式,例如:apple.com, google.com" )
1629 return
1730 }
1831
@@ -28,14 +41,63 @@ func (r *RootCmd) executeBatch(domainsStr string) {
2841 // 详细结果已在batch manager中打印,无需重复
2942}
3043
31- // parseDomains 解析域名列表
32- func parseDomains (domainsStr string ) []string {
33- var domains []string
34- for _ , domain := range strings .Split (domainsStr , "," ) {
44+ // parseDomains 解析域名列表,返回有效域名和无效域名
45+ func parseDomains (domainsStr string ) ([]string , []string ) {
46+ var validDomains []string
47+ var invalidDomains []string
48+
49+ // 支持空格分隔的域名列表
50+ fields := strings .Fields (domainsStr )
51+ for _ , domain := range fields {
3552 domain = strings .TrimSpace (domain )
36- if domain != "" {
37- domains = append (domains , domain )
53+ if domain == "" {
54+ continue
55+ }
56+
57+ if isValidDomain (domain ) {
58+ validDomains = append (validDomains , domain )
59+ } else {
60+ invalidDomains = append (invalidDomains , domain )
3861 }
3962 }
40- return domains
63+ return validDomains , invalidDomains
64+ }
65+
66+ // isValidDomain 验证域名格式是否有效
67+ func isValidDomain (domain string ) bool {
68+ // 基本长度检查
69+ if len (domain ) == 0 || len (domain ) > 253 {
70+ return false
71+ }
72+
73+ // 检查是否包含非法字符
74+ if strings .ContainsAny (domain , " \t \n \r " ) {
75+ return false
76+ }
77+
78+ // 检查是否以点开头或结尾
79+ if strings .HasPrefix (domain , "." ) || strings .HasSuffix (domain , "." ) {
80+ return false
81+ }
82+
83+ // 检查是否包含连续的点
84+ if strings .Contains (domain , ".." ) {
85+ return false
86+ }
87+
88+ // 使用正则表达式验证域名格式
89+ domainRegex := regexp .MustCompile (`^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$` )
90+ if ! domainRegex .MatchString (domain ) {
91+ return false
92+ }
93+
94+ // 尝试解析域名(不进行实际DNS查询)
95+ _ , err := net .LookupHost (domain )
96+ if err != nil {
97+ // 即使DNS解析失败,只要格式正确就认为是有效的
98+ // 因为可能是网络问题或域名确实不存在
99+ return true
100+ }
101+
102+ return true
41103}
0 commit comments