Files
EdgeNode/internal/waf/get302_validator.go

60 lines
1.8 KiB
Go
Raw Normal View History

2021-07-18 15:51:49 +08:00
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package waf
import (
"github.com/TeaOSLab/EdgeNode/internal/utils"
"github.com/TeaOSLab/EdgeNode/internal/waf/requests"
"github.com/iwind/TeaGo/types"
2021-07-18 15:51:49 +08:00
"net/http"
"time"
)
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)
2021-07-18 15:51:49 +08:00
writer.WriteHeader(http.StatusBadRequest)
_, _ = writer.Write([]byte("invalid request"))
return
}
m, err := utils.SimpleDecryptMap(info)
if err != nil {
request.ProcessResponseHeaders(writer.Header(), http.StatusBadRequest)
writer.WriteHeader(http.StatusBadRequest)
2021-07-18 15:51:49 +08:00
_, _ = writer.Write([]byte("invalid request"))
return
}
var timestamp = m.GetInt64("timestamp")
if time.Now().Unix()-timestamp > 5 { // 超过5秒认为失效
request.ProcessResponseHeaders(writer.Header(), http.StatusBadRequest)
2021-07-18 15:51:49 +08:00
writer.WriteHeader(http.StatusBadRequest)
_, _ = writer.Write([]byte("invalid request"))
return
}
// 加入白名单
var life = m.GetInt64("life")
2021-07-18 15:51:49 +08:00
if life <= 0 {
life = 600 // 默认10分钟
}
var setId = types.String(m.GetInt64("setId"))
2022-01-10 19:54:10 +08:00
SharedIPWhiteList.RecordIP("set:"+setId, m.GetString("scope"), request.WAFServerId(), request.WAFRemoteIP(), time.Now().Unix()+life, m.GetInt64("policyId"), false, m.GetInt64("groupId"), m.GetInt64("setId"), "")
2021-07-18 15:51:49 +08:00
// 返回原始URL
var url = m.GetString("url")
request.ProcessResponseHeaders(writer.Header(), http.StatusFound)
2021-07-18 15:51:49 +08:00
http.Redirect(writer, request.WAFRaw(), url, http.StatusFound)
}