mirror of
https://gitee.com/samwaf/SamWaf.git
synced 2026-11-04 23:06:15 +08:00
34 lines
1.2 KiB
Go
34 lines
1.2 KiB
Go
package wafipban
|
|
|
|
import "SamWaf/cache"
|
|
|
|
// loadRecord 从缓存读取结构体记录,两种缓存后端语义一致:
|
|
// 内存后端(WafCache) Get 原样返回存入的 Go 值,断言快路径一次命中;
|
|
// JSON 类后端(RedisCache) Get 返回 map[string]interface{} 泛型——断言必然失败
|
|
// 且白浪费一次往返,直接走 GetAs 反序列化。
|
|
//
|
|
// 返回的是缓存中的共享快照,调用方不得原地修改:写路径必须先克隆副本、
|
|
// 改完再整体回写,读路径才能在无锁状态下安全遍历。
|
|
func loadRecord[T any](store cache.CacheStore, key string) *T {
|
|
if _, isMem := store.(*cache.WafCache); isMem {
|
|
val := store.Get(key)
|
|
if val == nil {
|
|
return nil
|
|
}
|
|
// 类型不符说明私有 keyspace 被写入了非预期形态,按不存在处理
|
|
rec, _ := val.(*T)
|
|
return rec
|
|
}
|
|
var rec *T
|
|
if err := store.GetAs(key, &rec); err != nil || rec == nil {
|
|
return nil
|
|
}
|
|
return rec
|
|
}
|
|
|
|
// IsBannedRecord 失败记录是否带封禁阈值戳(自定义规则真实命中过)。
|
|
// 封禁列表与归属地查询共用这一判据,避免两处谓词写法漂移。
|
|
func IsBannedRecord(r *IPFailureRecord) bool {
|
|
return r != nil && r.TriggerMinutes > 0 && r.TriggerCount > 0
|
|
}
|