文件 v1.0.0

風險評分

本頁說明四個偵測維度如何並行計算、合併成 0–100 分,以及分數如何決定請求的速率分級。

計算方式

dynamicScore 為四個維度各開一個 goroutine,每個維度累積自己的分數、flag 與明細(Detail),完成後以 mutex 合併:

維度 函式 頁面
關聯 calcBasic 關聯訊號
地理 calcGeo 地理偵測
行為 calcBehavior 行為訊號
指紋 calcFingerprint Session 與指紋

任一維度回傳錯誤,整次評分即失敗(見 請求流程 的錯誤處理邊界)。

合併規則

總分 = 各維度分數加總
若 Detail 的 key 數 > 4,總分再加 25
總分上限 100

Detail 以 key 計數而非 flag 數:geo_high_risk 與 geo_hopping 共用 geoCountries/countries 兩個 key,同時觸發時只算一次。

分級

欄位 條件 預設門檻 效果
IsBlock 總分 >= 100 固定 該次請求回 403
IsDangerous 總分 >= ScoreDangerous 80 改用 RateLimitDangerous
IsSuspicious 總分 >= ScoreSuspicious 50 改用 RateLimitSuspicious
正常 其餘 - 只受 RateLimitNormal 限制

分數每次請求重新計算,不累積到下一次;持久的效果只來自各訊號在 Redis 中的計數與集合。

Flag 一覽

Flag 維度 分數
session_multi_ip 關聯 ScoreSessionMultiIP(1× 或 2×)
ip_multi_device 關聯 ScoreIPMultiDevice(1× 或 2×)
device_multi_ip 關聯 ScoreDeviceMultiIP(1× 或 2×)
frequent_404_errors/excessive_404_errors 關聯 ScoreNotFound404(1×/2×)
frequent_login_failures/excessive_login_failures 關聯 ScoreLoginFailure(1×/2×)
interval_request 行為 ScoreIntervalRequest
extremely_regular 行為 ScoreIntervalRequest × 1.5
too_frequent_requests 行為 ScoreFrequencyRequest
moderate_long_connection/long_connection/extremely_long_connection 行為 ScoreLongConnection(1×/1.5×/2×)
fp_multi_session 指紋 ScoreFpMultiSession
geo_high_risk 地理 ScoreGeoHighRisk
geo_hopping 地理 ScoreGeoHopping
geo_frequent_switching 地理 ScoreGeoFrequentSwitch
rapid_geo_change 地理 ScoreGeoRapidChange

預設值下的例子

情境 觸發 總分 結果
不帶 Cookie 的腳本,同一 IP 一小時內 13 個以上新指紋 ip_multi_device 2× 40 正常分級
同一 Session 7 次登入失敗 excessive_login_failures 30 正常分級
同一指紋一分鐘內 3 個 Session fp_multi_session 50 可疑分級,上限 50
上述三項加上 2 小時長連線 四項加總 142 上限 100 403

ScoreItem 與 flag 不會從 Check 回傳;需要觀察時只能從 Redis 推算或修改程式碼。

EN