package waf import ( "bytes" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" "github.com/TeaOSLab/EdgeNode/internal/waf/requests" "github.com/iwind/TeaGo/assert" "github.com/iwind/TeaGo/lists" "github.com/iwind/TeaGo/logs" "mime/multipart" "net/http" "net/url" "strings" "testing" "time" ) func Test_Template(t *testing.T) { var a = assert.NewAssertion(t) var waf = Template() for _, group := range waf.Inbound { group.IsOn = true for _, set := range group.RuleSets { set.IsOn = true } } err := waf.Init() if err != nil { t.Fatal(err) } testTemplate1001(a, t, waf) testTemplate1002(a, t, waf) testTemplate1003(a, t, waf) testTemplate2001(a, t, waf) testTemplate3001(a, t, waf) testTemplate4001(a, t, waf) testTemplate5001(a, t, waf) testTemplate6001(a, t, waf) testTemplate7001(a, t, waf) testTemplate20001(a, t, waf) } func Test_Template2(t *testing.T) { reader := bytes.NewReader([]byte(strings.Repeat("HELLO", 1024))) req, err := http.NewRequest(http.MethodPost, "https://example.com/index.php?id=123", reader) if err != nil { t.Fatal(err) } waf := Template() var errs = waf.Init() if len(errs) > 0 { t.Fatal(errs[0]) } now := time.Now() goNext, _, _, set, err := waf.MatchRequest(requests.NewTestRequest(req), nil, firewallconfigs.ServerCaptchaTypeNone) if err != nil { t.Fatal(err) } t.Log(time.Since(now).Seconds()*1000, "ms") if goNext { t.Log("ok") return } logs.PrintAsJSON(set, t) } func BenchmarkTemplate(b *testing.B) { var waf = Template() for _, group := range waf.Inbound { group.IsOn = true for _, set := range group.RuleSets { set.IsOn = true } } err := waf.Init() if err != nil { b.Fatal(err) } b.ResetTimer() for i := 0; i < b.N; i++ { req, err := http.NewRequest(http.MethodGet, "https://example.com/index.php?id=123", nil) if err != nil { b.Fatal(err) } _, _, _, _, _ = waf.MatchRequest(requests.NewTestRequest(req), nil, firewallconfigs.ServerCaptchaTypeNone) } } func testTemplate1001(a *assert.Assertion, t *testing.T, template *WAF) { req, err := http.NewRequest(http.MethodGet, "http://example.com/index.php?id=onmousedown%3D123", nil) if err != nil { t.Fatal(err) } _, _, _, result, err := template.MatchRequest(requests.NewTestRequest(req), nil, firewallconfigs.ServerCaptchaTypeNone) if err != nil { t.Fatal(err) } a.IsNotNil(result) if result != nil { a.IsTrue(result.Code == "1001") } } func testTemplate1002(a *assert.Assertion, t *testing.T, template *WAF) { req, err := http.NewRequest(http.MethodGet, "http://example.com/index.php?id=eval%28", nil) if err != nil { t.Fatal(err) } _, _, _, result, err := template.MatchRequest(requests.NewTestRequest(req), nil, firewallconfigs.ServerCaptchaTypeNone) if err != nil { t.Fatal(err) } a.IsNotNil(result) if result != nil { a.IsTrue(result.Code == "1002") } } func testTemplate1003(a *assert.Assertion, t *testing.T, template *WAF) { req, err := http.NewRequest(http.MethodGet, "http://example.com/index.php?id=