WAF增加通配符匹配/不匹配操作符

This commit is contained in:
刘祥超
2023-08-13 10:37:58 +08:00
parent edf98f1889
commit 0a290251cd
2 changed files with 40 additions and 23 deletions

View File

@@ -127,6 +127,21 @@ func (this *Rule) Init() error {
this.ipList = values.ParseStringList(this.Value, true) this.ipList = values.ParseStringList(this.Value, true)
case RuleOperatorIPRange, RuleOperatorNotIPRange: case RuleOperatorIPRange, RuleOperatorNotIPRange:
this.ipRangeListValue = values.ParseIPRangeList(this.Value) this.ipRangeListValue = values.ParseIPRangeList(this.Value)
case RuleOperatorWildcardMatch, RuleOperatorWildcardNotMatch:
var pieces = strings.Split(this.Value, "*")
for index, piece := range pieces {
pieces[index] = regexp.QuoteMeta(piece)
}
var pattern = strings.Join(pieces, "(.*)")
var expr = "^" + pattern + "$"
if this.IsCaseInsensitive {
expr = "(?i)" + expr
}
reg, err := re.Compile(expr)
if err != nil {
return err
}
this.reg = reg
} }
if singleParamRegexp.MatchString(this.Param) { if singleParamRegexp.MatchString(this.Param) {
@@ -369,7 +384,7 @@ func (this *Rule) Test(value interface{}) bool {
} else { } else {
return types.String(value) != this.Value return types.String(value) != this.Value
} }
case RuleOperatorMatch: case RuleOperatorMatch, RuleOperatorWildcardMatch:
if value == nil { if value == nil {
return false return false
} }
@@ -393,7 +408,7 @@ func (this *Rule) Test(value interface{}) bool {
// string // string
return utils.MatchStringCache(this.reg, types.String(value)) return utils.MatchStringCache(this.reg, types.String(value))
case RuleOperatorNotMatch: case RuleOperatorNotMatch, RuleOperatorWildcardNotMatch:
if value == nil { if value == nil {
return true return true
} }

View File

@@ -4,27 +4,29 @@ type RuleOperator = string
type RuleCaseInsensitive = string type RuleCaseInsensitive = string
const ( const (
RuleOperatorGt RuleOperator = "gt" RuleOperatorGt RuleOperator = "gt"
RuleOperatorGte RuleOperator = "gte" RuleOperatorGte RuleOperator = "gte"
RuleOperatorLt RuleOperator = "lt" RuleOperatorLt RuleOperator = "lt"
RuleOperatorLte RuleOperator = "lte" RuleOperatorLte RuleOperator = "lte"
RuleOperatorEq RuleOperator = "eq" RuleOperatorEq RuleOperator = "eq"
RuleOperatorNeq RuleOperator = "neq" RuleOperatorNeq RuleOperator = "neq"
RuleOperatorEqString RuleOperator = "eq string" RuleOperatorEqString RuleOperator = "eq string"
RuleOperatorNeqString RuleOperator = "neq string" RuleOperatorNeqString RuleOperator = "neq string"
RuleOperatorMatch RuleOperator = "match" RuleOperatorMatch RuleOperator = "match"
RuleOperatorNotMatch RuleOperator = "not match" RuleOperatorNotMatch RuleOperator = "not match"
RuleOperatorContains RuleOperator = "contains" RuleOperatorWildcardMatch RuleOperator = "wildcard match"
RuleOperatorNotContains RuleOperator = "not contains" RuleOperatorWildcardNotMatch RuleOperator = "wildcard not match"
RuleOperatorPrefix RuleOperator = "prefix" RuleOperatorContains RuleOperator = "contains"
RuleOperatorSuffix RuleOperator = "suffix" RuleOperatorNotContains RuleOperator = "not contains"
RuleOperatorContainsAny RuleOperator = "contains any" RuleOperatorPrefix RuleOperator = "prefix"
RuleOperatorContainsAll RuleOperator = "contains all" RuleOperatorSuffix RuleOperator = "suffix"
RuleOperatorInIPList RuleOperator = "in ip list" RuleOperatorContainsAny RuleOperator = "contains any"
RuleOperatorHasKey RuleOperator = "has key" // has key in slice or map RuleOperatorContainsAll RuleOperator = "contains all"
RuleOperatorVersionGt RuleOperator = "version gt" RuleOperatorInIPList RuleOperator = "in ip list"
RuleOperatorVersionLt RuleOperator = "version lt" RuleOperatorHasKey RuleOperator = "has key" // has key in slice or map
RuleOperatorVersionRange RuleOperator = "version range" RuleOperatorVersionGt RuleOperator = "version gt"
RuleOperatorVersionLt RuleOperator = "version lt"
RuleOperatorVersionRange RuleOperator = "version range"
RuleOperatorContainsBinary RuleOperator = "contains binary" // contains binary RuleOperatorContainsBinary RuleOperator = "contains binary" // contains binary
RuleOperatorNotContainsBinary RuleOperator = "not contains binary" // not contains binary RuleOperatorNotContainsBinary RuleOperator = "not contains binary" // not contains binary