2021-07-18 15:51:49 +08:00
|
|
|
package waf
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
|
|
|
|
"github.com/TeaOSLab/EdgeNode/internal/utils"
|
|
|
|
|
"github.com/TeaOSLab/EdgeNode/internal/waf/requests"
|
|
|
|
|
"github.com/iwind/TeaGo/maps"
|
2021-11-16 16:11:05 +08:00
|
|
|
"github.com/iwind/TeaGo/types"
|
2021-07-18 15:51:49 +08:00
|
|
|
"net/http"
|
|
|
|
|
"net/url"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
Get302Path = "/WAF/VERIFY/GET"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Get302Action
|
|
|
|
|
// 原理: origin url --> 302 verify url --> origin url
|
|
|
|
|
// TODO 将来支持meta refresh验证
|
|
|
|
|
type Get302Action struct {
|
|
|
|
|
BaseAction
|
|
|
|
|
|
2021-10-18 20:08:43 +08:00
|
|
|
Life int32 `yaml:"life" json:"life"`
|
|
|
|
|
Scope string `yaml:"scope" json:"scope"`
|
2021-07-18 15:51:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (this *Get302Action) Init(waf *WAF) error {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (this *Get302Action) Code() string {
|
|
|
|
|
return ActionGet302
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (this *Get302Action) IsAttack() bool {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (this *Get302Action) WillChange() bool {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-20 20:54:41 +08:00
|
|
|
func (this *Get302Action) Perform(waf *WAF, group *RuleGroup, set *RuleSet, request requests.Request, writer http.ResponseWriter) PerformResult {
|
2021-07-18 15:51:49 +08:00
|
|
|
// 仅限于Get
|
|
|
|
|
if request.WAFRaw().Method != http.MethodGet {
|
2024-01-20 20:54:41 +08:00
|
|
|
return PerformResult{
|
|
|
|
|
ContinueRequest: true,
|
|
|
|
|
}
|
2021-07-18 15:51:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 是否已经在白名单中
|
2021-11-16 16:11:05 +08:00
|
|
|
if SharedIPWhiteList.Contains("set:"+types.String(set.Id), this.Scope, request.WAFServerId(), request.WAFRemoteIP()) {
|
2024-01-20 20:54:41 +08:00
|
|
|
return PerformResult{
|
|
|
|
|
ContinueRequest: true,
|
|
|
|
|
}
|
2021-07-18 15:51:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var m = maps.Map{
|
|
|
|
|
"url": request.WAFRaw().URL.String(),
|
|
|
|
|
"timestamp": time.Now().Unix(),
|
|
|
|
|
"life": this.Life,
|
2021-10-18 20:08:43 +08:00
|
|
|
"scope": this.Scope,
|
2021-11-17 16:16:09 +08:00
|
|
|
"policyId": waf.Id,
|
|
|
|
|
"groupId": group.Id,
|
2021-07-18 15:51:49 +08:00
|
|
|
"setId": set.Id,
|
|
|
|
|
}
|
|
|
|
|
info, err := utils.SimpleEncryptMap(m)
|
|
|
|
|
if err != nil {
|
|
|
|
|
remotelogs.Error("WAF_GET_302_ACTION", "encode info failed: "+err.Error())
|
2024-01-20 20:54:41 +08:00
|
|
|
return PerformResult{
|
|
|
|
|
ContinueRequest: true,
|
|
|
|
|
}
|
2021-07-18 15:51:49 +08:00
|
|
|
}
|
|
|
|
|
|
2023-12-03 14:41:11 +08:00
|
|
|
request.DisableStat()
|
2023-06-12 18:07:07 +08:00
|
|
|
request.ProcessResponseHeaders(writer.Header(), http.StatusFound)
|
2021-07-18 15:51:49 +08:00
|
|
|
http.Redirect(writer, request.WAFRaw(), Get302Path+"?info="+url.QueryEscape(info), http.StatusFound)
|
|
|
|
|
|
2023-03-06 16:10:58 +08:00
|
|
|
flusher, ok := writer.(http.Flusher)
|
|
|
|
|
if ok {
|
|
|
|
|
flusher.Flush()
|
2021-07-26 14:33:06 +08:00
|
|
|
}
|
2024-01-20 20:54:41 +08:00
|
|
|
|
|
|
|
|
return PerformResult{}
|
2021-07-18 15:51:49 +08:00
|
|
|
}
|