Files
EdgeNode/internal/waf/get302_validator.go
GoEdgeLab c19be78e0d v1.4.1
2024-07-27 15:42:50 +08:00

93 lines
2.4 KiB
Go

// Copyright 2021 GoEdge goedge.cdn@gmail.com. All rights reserved.
package waf
import (
"net/http"
"time"
"github.com/TeaOSLab/EdgeNode/internal/utils"
"github.com/TeaOSLab/EdgeNode/internal/waf/requests"
"github.com/iwind/TeaGo/types"
)
var get302Validator = NewGet302Validator()
type Get302Validator struct {
}
func NewGet302Validator() *Get302Validator {
return &Get302Validator{}
}
func (this *Get302Validator) Run(request requests.Request, writer http.ResponseWriter) {
var info = request.WAFRaw().URL.Query().Get("info")
if len(info) == 0 {
request.ProcessResponseHeaders(writer.Header(), http.StatusBadRequest)
writer.WriteHeader(http.StatusBadRequest)
_, _ = writer.Write([]byte("invalid request (002)"))
return
}
var timestamp int64
var life int64
var setId int64
var policyId int64
var groupId int64
var scope string
var url string
var infoArg = &InfoArg{}
decodeErr := infoArg.Decode(info)
var success bool
if decodeErr == nil && infoArg.IsValid() {
success = true
timestamp = infoArg.Timestamp
life = int64(infoArg.Life)
setId = infoArg.SetId
policyId = infoArg.PolicyId
groupId = infoArg.GroupId
scope = infoArg.Scope
url = infoArg.URL
} else {
// 兼容老版本
m, decodeMapErr := utils.SimpleDecryptMap(info)
if decodeMapErr == nil {
success = true
timestamp = m.GetInt64("timestamp")
life = m.GetInt64("life")
setId = m.GetInt64("setId")
policyId = m.GetInt64("policyId")
groupId = m.GetInt64("groupId")
scope = m.GetString("scope")
url = m.GetString("url")
}
}
if !success {
request.ProcessResponseHeaders(writer.Header(), http.StatusBadRequest)
writer.WriteHeader(http.StatusBadRequest)
_, _ = writer.Write([]byte("invalid request (003)"))
return
}
if time.Now().Unix()-timestamp > 5 { // 超过5秒认为失效
request.ProcessResponseHeaders(writer.Header(), http.StatusBadRequest)
writer.WriteHeader(http.StatusBadRequest)
_, _ = writer.Write([]byte("invalid request (004)"))
return
}
// 加入白名单
if life <= 0 {
life = 600 // 默认10分钟
}
SharedIPWhiteList.RecordIP("set:"+types.String(setId), scope, request.WAFServerId(), request.WAFRemoteIP(), time.Now().Unix()+life, policyId, false, groupId, setId, "")
// 返回原始URL
request.ProcessResponseHeaders(writer.Header(), http.StatusFound)
http.Redirect(writer, request.WAFRaw(), url, http.StatusFound)
}