diff --git a/internal/waf/action_page.go b/internal/waf/action_page.go index 499ad3a..565bdd1 100644 --- a/internal/waf/action_page.go +++ b/internal/waf/action_page.go @@ -15,6 +15,9 @@ type PageAction struct { } func (this *PageAction) Init(waf *WAF) error { + if this.Status <= 0 { + this.Status = http.StatusForbidden + } return nil } diff --git a/internal/waf/action_redirect.go b/internal/waf/action_redirect.go new file mode 100644 index 0000000..63a1e02 --- /dev/null +++ b/internal/waf/action_redirect.go @@ -0,0 +1,43 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package waf + +import ( + "github.com/TeaOSLab/EdgeNode/internal/waf/requests" + "net/http" +) + +type RedirectAction struct { + BaseAction + + Status int `yaml:"status" json:"status"` + URL string `yaml:"url" json:"url"` +} + +func (this *RedirectAction) Init(waf *WAF) error { + if this.Status <= 0 { + this.Status = http.StatusTemporaryRedirect + } + return nil +} + +func (this *RedirectAction) Code() string { + return ActionRedirect +} + +func (this *RedirectAction) IsAttack() bool { + return false +} + +// WillChange determine if the action will change the request +func (this *RedirectAction) WillChange() bool { + return true +} + +// Perform the action +func (this *RedirectAction) Perform(waf *WAF, group *RuleGroup, set *RuleSet, request requests.Request, writer http.ResponseWriter) (continueRequest bool, goNextSet bool) { + writer.Header().Set("Location", this.URL) + writer.WriteHeader(this.Status) + + return false, false +} diff --git a/internal/waf/action_types.go b/internal/waf/action_types.go index 2ce8778..1d77f84 100644 --- a/internal/waf/action_types.go +++ b/internal/waf/action_types.go @@ -15,6 +15,7 @@ const ( ActionRecordIP ActionString = "record_ip" // 记录IP ActionTag ActionString = "tag" // 标签 ActionPage ActionString = "page" // 显示网页 + ActionRedirect ActionString = "redirect" // 跳转 ActionAllow ActionString = "allow" // allow ActionGoGroup ActionString = "go_group" // go to next rule group ActionGoSet ActionString = "go_set" // go to next rule set @@ -87,6 +88,12 @@ var AllActions = []*ActionDefinition{ Instance: new(PageAction), Type: reflect.TypeOf(new(PageAction)).Elem(), }, + { + Name: "跳转", + Code: ActionRedirect, + Instance: new(RedirectAction), + Type: reflect.TypeOf(new(RedirectAction)).Elem(), + }, { Name: "跳到下一个规则分组", Code: ActionGoGroup,