diff --git a/internal/caches/list_file.go b/internal/caches/list_file.go index 8b1386c..83b8462 100644 --- a/internal/caches/list_file.go +++ b/internal/caches/list_file.go @@ -331,11 +331,11 @@ func (this *FileList) Close() error { } func (this *FileList) GetDBIndex(hash string) uint64 { - return fnv.Hash(hash) % CountFileDB + return fnv.HashString(hash) % CountFileDB } func (this *FileList) getDB(hash string) *FileListDB { - return this.dbList[fnv.Hash(hash)%CountFileDB] + return this.dbList[fnv.HashString(hash)%CountFileDB] } func (this *FileList) remove(hash string) (notFound bool, err error) { diff --git a/internal/ttlcache/cache.go b/internal/ttlcache/cache.go index f7a10ff..06db1c1 100644 --- a/internal/ttlcache/cache.go +++ b/internal/ttlcache/cache.go @@ -74,12 +74,12 @@ func (this *Cache) Write(key string, value interface{}, expiredAt int64) (ok boo return } - currentTimestamp := time.Now().Unix() + var currentTimestamp = utils.UnixTime() if expiredAt <= currentTimestamp { return } - maxExpiredAt := currentTimestamp + 30*86400 + var maxExpiredAt = currentTimestamp + 30*86400 if expiredAt > maxExpiredAt { expiredAt = maxExpiredAt } diff --git a/internal/utils/fnv/hash.go b/internal/utils/fnv/hash.go index 644f9e4..581d565 100644 --- a/internal/utils/fnv/hash.go +++ b/internal/utils/fnv/hash.go @@ -7,9 +7,20 @@ const ( prime64 uint64 = 1099511628211 ) -// Hash +// HashString // 非unique Hash -func Hash(key string) uint64 { +func HashString(key string) uint64 { + var hash = offset64 + for _, b := range key { + hash ^= uint64(b) + hash *= prime64 + } + return hash +} + +// Hash +// 非unique Hash +func Hash(key []byte) uint64 { var hash = offset64 for _, b := range key { hash ^= uint64(b) diff --git a/internal/utils/fnv/hash_test.go b/internal/utils/fnv/hash_test.go index 524778f..3b43293 100644 --- a/internal/utils/fnv/hash_test.go +++ b/internal/utils/fnv/hash_test.go @@ -10,7 +10,7 @@ import ( func TestHash(t *testing.T) { for _, key := range []string{"costarring", "liquid", "hello"} { - var h = fnv.Hash(key) + var h = fnv.HashString(key) t.Log(key + " => " + types.String(h)) } } diff --git a/internal/waf/checkpoints/checkpoint.go b/internal/waf/checkpoints/checkpoint.go index 3535084..ef3b58a 100644 --- a/internal/waf/checkpoints/checkpoint.go +++ b/internal/waf/checkpoints/checkpoint.go @@ -1,5 +1,10 @@ package checkpoints +import ( + "github.com/TeaOSLab/EdgeNode/internal/waf/requests" + "net/http" +) + type Checkpoint struct { } @@ -30,3 +35,16 @@ func (this *Checkpoint) Start() { func (this *Checkpoint) Stop() { } + +func (this *Checkpoint) RequestBodyIsEmpty(req requests.Request) bool { + if req.WAFRaw().ContentLength == 0 { + return true + } + + var method = req.WAFRaw().Method + if method == http.MethodHead || method == http.MethodGet { + return true + } + + return false +} diff --git a/internal/waf/checkpoints/request_all.go b/internal/waf/checkpoints/request_all.go index 30a5f98..fc76b97 100644 --- a/internal/waf/checkpoints/request_all.go +++ b/internal/waf/checkpoints/request_all.go @@ -18,6 +18,11 @@ func (this *RequestAllCheckpoint) RequestValue(req requests.Request, param strin valueBytes = append(valueBytes, req.WAFRaw().URL.RequestURI()...) } + if this.RequestBodyIsEmpty(req) { + value = valueBytes + return + } + if req.WAFRaw().Body != nil { valueBytes = append(valueBytes, ' ') diff --git a/internal/waf/checkpoints/request_body.go b/internal/waf/checkpoints/request_body.go index a04d0ff..ce00565 100644 --- a/internal/waf/checkpoints/request_body.go +++ b/internal/waf/checkpoints/request_body.go @@ -11,6 +11,11 @@ type RequestBodyCheckpoint struct { } func (this *RequestBodyCheckpoint) RequestValue(req requests.Request, param string, options maps.Map) (value interface{}, sysErr error, userErr error) { + if this.RequestBodyIsEmpty(req) { + value = "" + return + } + if req.WAFRaw().Body == nil { value = "" return diff --git a/internal/waf/checkpoints/request_form_arg.go b/internal/waf/checkpoints/request_form_arg.go index 1862784..9ebc929 100644 --- a/internal/waf/checkpoints/request_form_arg.go +++ b/internal/waf/checkpoints/request_form_arg.go @@ -12,6 +12,11 @@ type RequestFormArgCheckpoint struct { } func (this *RequestFormArgCheckpoint) RequestValue(req requests.Request, param string, options maps.Map) (value interface{}, sysErr error, userErr error) { + if this.RequestBodyIsEmpty(req) { + value = "" + return + } + if req.WAFRaw().Body == nil { value = "" return diff --git a/internal/waf/checkpoints/request_upload.go b/internal/waf/checkpoints/request_upload.go index ed43dcf..9608f0e 100644 --- a/internal/waf/checkpoints/request_upload.go +++ b/internal/waf/checkpoints/request_upload.go @@ -17,6 +17,11 @@ type RequestUploadCheckpoint struct { } func (this *RequestUploadCheckpoint) RequestValue(req requests.Request, param string, options maps.Map) (value interface{}, sysErr error, userErr error) { + if this.RequestBodyIsEmpty(req) { + value = "" + return + } + value = "" if param == "minSize" || param == "maxSize" { value = 0 diff --git a/internal/waf/checkpoints/response_body.go b/internal/waf/checkpoints/response_body.go index a39fc67..beffed2 100644 --- a/internal/waf/checkpoints/response_body.go +++ b/internal/waf/checkpoints/response_body.go @@ -22,6 +22,11 @@ func (this *ResponseBodyCheckpoint) RequestValue(req requests.Request, param str } func (this *ResponseBodyCheckpoint) ResponseValue(req requests.Request, resp *requests.Response, param string, options maps.Map) (value interface{}, sysErr error, userErr error) { + if resp.ContentLength == 0 { + value = "" + return + } + value = "" if resp != nil && resp.Body != nil { if len(resp.BodyData) > 0 {