Jelajahi Sumber

feat(validation): 支持中文域名验证

- 在域名验证中增加对中文域名的支持
- 使用 IDNA 协议将中文域名转换为 ASCII 格式
-通过 validator 内置的 hostname_rfc1123 规则验证转换后的域名
- 优化 wafformatter 中的域名处理逻辑,忽略无效域名的错误
fusu 1 bulan lalu
induk
melakukan
6bbba578a2
2 mengubah file dengan 16 tambahan dan 4 penghapusan
  1. 1 1
      internal/service/wafformatter.go
  2. 15 3
      pkg/validation/validation.go

+ 1 - 1
internal/service/wafformatter.go

@@ -165,7 +165,7 @@ func (s *wafFormatterService) ConvertToWildcardDomain(ctx context.Context, domai
 	if err != nil {
 		s.logger.Error("无效的域名", zap.String("domain", domain), zap.Error(err))
 		// 如果域名无效(如 IP 地址、localhost),则返回错误。
-		return "",err
+		return "",nil
 	}
 
 	// 2. 比较原始域名和可注册域名。

+ 15 - 3
pkg/validation/validation.go

@@ -168,9 +168,21 @@ func validateHostPort(fl validator.FieldLevel) bool {
 	if portInt <= 0 || portInt > 65535 {
 		return false
 	}
-	// 如果不是 IP,则检查它是否为有效的主机名 (使用 validator 内置的 hostname_rfc1123 逻辑)
-	// 我们不能直接调用,但可以通过 Var 来间接使用它
-	err = getInstance().Var(host, "hostname_rfc1123")
+
+	// --- 如果不是 IP,则按域名处理(这是支持中文域名的关键部分) ---
+
+	// 4. 将可能为中文的域名转换为 Punycode (ASCII) 格式
+	// 例如: "例子.com" -> "xn--fsq270a.com"
+	asciiHost, err := idna.ToASCII(host)
+	if err != nil {
+		// 如果转换失败,说明主机名包含无效字符(如下划线 "_" 等),不是合法的域名
+		return false
+	}
+	// 5. 使用 validator 内置的 hostname_rfc1123 规则来验证转换后的 ASCII 域名
+	// RFC 1123 是对主机名规范的常见标准。
+	// 注意:我们验证的是 asciiHost,而不是原始的 host。
+	v := getInstance()
+	err = v.Var(asciiHost, "fqdn")
 	return err == nil
 }