mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-18 19:50:25 +08:00
实现WAF
This commit is contained in:
82
internal/waf/action_utils.go
Normal file
82
internal/waf/action_utils.go
Normal file
@@ -0,0 +1,82 @@
|
||||
package waf
|
||||
|
||||
import (
|
||||
"github.com/iwind/TeaGo/maps"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
var AllActions = []*ActionDefinition{
|
||||
{
|
||||
Name: "阻止",
|
||||
Code: ActionBlock,
|
||||
Instance: new(BlockAction),
|
||||
},
|
||||
{
|
||||
Name: "允许通过",
|
||||
Code: ActionAllow,
|
||||
Instance: new(AllowAction),
|
||||
},
|
||||
{
|
||||
Name: "允许并记录日志",
|
||||
Code: ActionLog,
|
||||
Instance: new(LogAction),
|
||||
},
|
||||
{
|
||||
Name: "Captcha验证码",
|
||||
Code: ActionCaptcha,
|
||||
Instance: new(CaptchaAction),
|
||||
},
|
||||
{
|
||||
Name: "跳到下一个规则分组",
|
||||
Code: ActionGoGroup,
|
||||
Instance: new(GoGroupAction),
|
||||
Type: reflect.TypeOf(new(GoGroupAction)).Elem(),
|
||||
},
|
||||
{
|
||||
Name: "跳到下一个规则集",
|
||||
Code: ActionGoSet,
|
||||
Instance: new(GoSetAction),
|
||||
Type: reflect.TypeOf(new(GoSetAction)).Elem(),
|
||||
},
|
||||
}
|
||||
|
||||
func FindActionInstance(action ActionString, options maps.Map) ActionInterface {
|
||||
for _, def := range AllActions {
|
||||
if def.Code == action {
|
||||
if def.Type != nil {
|
||||
// create new instance
|
||||
ptrValue := reflect.New(def.Type)
|
||||
instance := ptrValue.Interface().(ActionInterface)
|
||||
|
||||
if len(options) > 0 {
|
||||
count := def.Type.NumField()
|
||||
for i := 0; i < count; i++ {
|
||||
field := def.Type.Field(i)
|
||||
tag, ok := field.Tag.Lookup("yaml")
|
||||
if ok {
|
||||
v, ok := options[tag]
|
||||
if ok && reflect.TypeOf(v) == field.Type {
|
||||
ptrValue.Elem().FieldByName(field.Name).Set(reflect.ValueOf(v))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return instance
|
||||
}
|
||||
|
||||
// return shared instance
|
||||
return def.Instance
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func FindActionName(action ActionString) string {
|
||||
for _, def := range AllActions {
|
||||
if def.Code == action {
|
||||
return def.Name
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
Reference in New Issue
Block a user