風險評分
本頁說明四個偵測維度如何並行計算、合併成 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 推算或修改程式碼。