mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-02 22:10:25 +08:00
93 lines
2.4 KiB
Go
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)
|
|
}
|