Procházet zdrojové kódy

feat(waf): 增加域名转换为通配符域名的功能并应用于 webforwarding 白名单任务

- 新增 ConvertToWildcardDomain 函数,用于将域名转换为通配符域名
- 在 webforwarding 服务中,使用通配符域名替代原始域名进行白名单任务处理
- 优化了域名白名单的添加和删除逻辑,确保正确处理子域名情况
fusu před 1 měsícem
rodič
revize
df298caa3d

+ 23 - 0
internal/service/wafformatter.go

@@ -6,6 +6,7 @@ import (
 	v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
 	"github.com/go-nunu/nunu-layout-advanced/internal/repository"
 	"github.com/spf13/cast"
+	"golang.org/x/net/publicsuffix"
 	"slices"
 	"strconv"
 )
@@ -15,6 +16,7 @@ type WafFormatterService interface {
 	sendFormData(ctx context.Context,addTokenUrl string,addSendUrl string,formData map[string]interface{}) (int, error)
 	validateWafPortCount(ctx context.Context, hostId int) error
 	validateWafDomainCount(ctx context.Context, req v1.GlobalRequire) error
+	ConvertToWildcardDomain(ctx context.Context,domain string) (string, error)
 }
 func NewWafFormatterService(
     service *Service,
@@ -139,4 +141,25 @@ func (s *wafFormatterService) validateWafDomainCount(ctx context.Context, req v1
 		}
 	}
 	return nil
+}
+func (s *wafFormatterService) ConvertToWildcardDomain(ctx context.Context, domain string) (string, error) {
+	// 1. 使用 EffectiveTLDPlusOne 获取可注册域名部分。
+	//    例如,对于 "www.google.com",这将返回 "google.com"。
+	//    对于 "a.b.c.tokyo.jp",这将返回 "c.tokyo.jp"。
+	registrableDomain, err := publicsuffix.EffectiveTLDPlusOne(domain)
+	if err != nil {
+		// 如果域名无效(如 IP 地址、localhost),则返回错误。
+		return "", fmt.Errorf("无法处理 '%s': %w", domain, err)
+	}
+
+	// 2. 比较原始域名和可注册域名。
+	//    如果它们不相等,说明原始域名包含子域名。
+	if domain != registrableDomain {
+		// 3. 如果存在子域名,则用 "*." 加上可注册域名来构造通配符域名。
+		return "*." + registrableDomain, nil
+	}
+
+	// 4. 如果原始域名和可注册域名相同(例如,输入就是 "google.com"),
+	//    则说明没有子域名可替换,直接返回原始域名。
+	return domain, nil
 }

+ 10 - 2
internal/service/webforwarding.go

@@ -308,7 +308,11 @@ func (s *webForwardingService) AddWebForwarding(ctx context.Context, req *v1.Web
 		return err
 	}
 	// 异步任务:将域名添加到白名单
-	go s.publishDomainWhitelistTask(req.WebForwardingData.Domain, "add")
+	doMain, err := s.wafformatter.ConvertToWildcardDomain(ctx, req.WebForwardingData.Domain)
+	if err != nil {
+		return err
+	}
+	go s.publishDomainWhitelistTask(doMain, "add")
 
 	webModel := s.buildWebForwardingModel(&req.WebForwardingData, wafWebId, require)
 
@@ -355,8 +359,12 @@ func (s *webForwardingService) EditWebForwarding(ctx context.Context, req *v1.We
 	}
 	// 异步任务:将域名添加到白名单
 	if webData.Domain != req.WebForwardingData.Domain {
+		doMain, err := s.wafformatter.ConvertToWildcardDomain(ctx, req.WebForwardingData.Domain)
+		if err != nil {
+			return err
+		}
 		go s.publishDomainWhitelistTask(webData.Domain, "del")
-		go s.publishDomainWhitelistTask(req.WebForwardingData.Domain, "add")
+		go s.publishDomainWhitelistTask(doMain, "add")
 	}