KKday 異常流量排查報告

Bot/Crawler Traffic Investigation — 2024-07 ~ 2026-03
KKday Data Team
Generated: 2026-03-06 15:30

分析脈絡

對應提問
從 2024 年末起,tableau_order_dd_session 資料源出現大量 CN、KR 等地的異常流量,需排查成因並提出過濾方案。
拆解方式
  1. Step 1: 按月查看各 ip_country 的 Session 量與 CVR 趨勢,定位異常起始時間
  2. Step 2: 拆解 CN 異常流量的 source_code / cid_channel,定位問題在 WEB 端
  3. Step 3: 分析 User-Agent 分布,識別爬蟲類型(GuzzleHttp、null UA、偽裝瀏覽器)
  4. Step 4: 跨國比對 CN/KR/US 的 UA 模式,確認為同一批攻擊者
  5. Step 5: 檢查 null UA 的 source 分布,確認排除不會誤殺正常流量
資料來源與欄位
  • dm_tableau.tableau_order_dd_session_gross
  • dw_middledb.action
  • dw_middledb.crawlers_ip(現有爬蟲 IP 黑名單)
  • dw_analysis_record.action_crawlers_cookie(現有爬蟲 cookie 黑名單)
資料區間
2024-07 ~ 2026-03-06

核心發現

異常流量並非 AI Search Bot(GPTBot/ClaudeBot/PerplexityBot 合計 < 0.1%), 而是使用 GuzzleHttp/6.5.5 PHP/8.0.30 的分散式爬蟲 + 大量 null User-Agent 的程式化存取 + 偽裝 Chrome 的 headless 自動化工具。

攻擊者跨 CN/KR/US 三國使用完全相同的工具組合,且 GuzzleHttp 會偽裝 APP source(IOS/ANDROID),直接打 KKday APP 的 API endpoint。

Phase 1 的 GuzzleHttp + null UA 過濾預計可排除 CN 49%、KR 84%、US 93% 的異常流量,且零誤殺風險。

Executive Summary

2025 年 9 月起,KKday 網站遭受大規模自動化爬蟲流量攻擊,影響遍及 CN、KR、US、NL 等多國,嚴重扭曲 Session 量和 CVR 指標。

CN 異常倍率
18x
Session 從 10 萬暴增至 180 萬
KR CVR 下跌
-68%
從 5.7% 下降至 1.8%
US 異常佔比
93%
null UA + GuzzleHttp 佔流量 93%
AI Bot 佔比
<0.1%
GPTBot / ClaudeBot 幾乎不存在

攻擊者特徵:使用相同的 GuzzleHttp/6.5.5 curl/7.81.0 PHP/8.0.30 工具, 跨 CN/KR/US 三國分散式爬取,偽裝 APP API endpoint(source 顯示為 IOS/ANDROID), 並搭配大量 null User-Agent 和偽裝 Chrome 瀏覽器的 headless 自動化工具。

異常國家 Session 量趨勢

CN 從 2025-09 起暴增,KR 持續攀升至 2026-01,US 從 2025-12 加入,NL 在 2025-06~09 期間曾大量出現後消退。

關鍵發現
CN 高峰出現在 2025-12(180 萬 sessions),KR 持續攀升至 2026-01(186 萬),US 從 2025-12 起急遽惡化(60 萬→71 萬)。NL 曾於 2025 年中期維持 60 萬/月的穩定爬蟲流量,後已消退。

CVR 趨勢:異常國家 vs 正常國家

正常國家(TW、JP)的 CVR 維持穩定,異常國家的 CVR 因分母灌水而崩跌。

關鍵發現
TW CVR 穩定在 4~6%,JP 穩定在 4.5~8.5%。CN CVR 從 7~10% 崩跌至 0.4%(正常值反而較高,因中國用戶多為目的明確的購買者)。KR 從 5.5% 持續下滑至 1.8%。

CN 異常流量定位:ORGANIC / WEB

拆解 CN 流量的 source_code + cid_channel,異常集中在 ORGANIC/WEB 組合。

關鍵發現
ORGANIC/WEB 從 2025-07 的 9K 暴增至 2025-10 的 116 萬(129 倍),CVR 從 35.8% 崩至 0.02%。同期 ORGANIC/IOS(APP 端)維持正常的 7~8% CVR,確認問題僅在 WEB 端。OWN CHANNEL/WEB 也逐步被波及。

User-Agent 分類:三國對比

將 User-Agent 分為五大類,比較 CN/KR/US 的異常流量組成。

關鍵發現
三國攻擊模式相同但比例不同:
US 最嚴重:80.6% 是 null UA
KR 規模最大:null UA (54%) + GuzzleHttp (30%) 合計 84%
CN 最多偽裝:regular_browser 佔 50.7%,含偽裝 Chrome/134 的 headless 工具
AI Search Bot 幾乎不存在:GPTBot / ClaudeBot / PerplexityBot 合計 < 0.1%

異常流量的 Source 分布:偽裝 APP 的鐵證

分析 null UA 和 GuzzleHttp 分別出現在哪些 source(WEB/MWEB/IOS/ANDROID)。

關鍵發現
null UA 全部集中在 WEB 和 MWEB,零筆出現在 IOS/ANDROID。正常瀏覽器一定帶 User-Agent,null UA 的網頁請求 100% 是程式化存取,排除不會誤殺 APP 用戶。

GuzzleHttp 大量偽裝為 IOS/ANDROID:GuzzleHttp 是 PHP HTTP Client,根本不可能是行動裝置。CN 的 GuzzleHttp 有 31 萬次偽裝 IOS、6 萬次偽裝 ANDROID;KR 更誇張,50 萬偽裝 IOS、44 萬偽裝 ANDROID。這些爬蟲直接打 KKday APP 的 API endpoint。

CN Top User-Agent 明細與 Cookies/IP 比率

分析 CN 2025-10 的 Top UA,用 cookies-per-IP 比率識別偽裝瀏覽器。

user_agent actions cookies ips note cookies_per_ip
Chrome/134.0.0.0 (Win10) 832,058 798,374 21,498 偽裝瀏覽器:37 cookies/IP 37.1
null (無 UA) 461,663 430,952 42,690 無 User-Agent 10.1
GuzzleHttp/6.5.5 PHP/8.0.30 370,254 36,187 82,223 PHP HTTP Client 0.4
GuzzleHttp/7 5,394 5,187 4,236 PHP HTTP Client 1.2
Chrome/141 Edge/141 5,139 2,065 1,356 可能正常 1.5
Chrome/141.0.0.0 2,112 905 635 可能正常 1.4
Safari/18.6 (iPhone) 1,602 680 629 正常流量 1.1
關鍵發現
Chrome/134.0.0.0 的 cookies/IP 比率高達 37.1,代表每個 IP 產出 37 個不同 cookie — 典型的 headless browser 自動化行為(正常瀏覽器每 IP 通常 1~3 個 cookie)。
GuzzleHttp 雖然 cookies/IP 較低(0.4),但它用 8.2 萬個不同 IP 分散爬取,是分散式爬蟲。

2026-03 最新狀態

截至 2026 年 3 月,各異常國家的最新狀態。

國家 基線 Sessions 最新 (2026-02) 倍率 CVR 變化 趨勢 最新 (2026-01)
CN ~100K 842K 8x 7~10% → 0.89% 較高峰下降,仍嚴重 NaN
KR ~1.3M 1.61M 1.2x 5.5% → 1.77% 持續惡化中 NaN
US ~190K 652K 3.4x 3.0% → 0.67% 持續惡化中 NaN
NL ~620K NaN 已消退 0.02% → 0.33% 已自然消退 38K
GB ~55K 114K 2.1x 1.2% → 0.66% 中等,持續 NaN
FR/DE/ES/IT <30K 40~74K 2~3x — → <0.6% 新出現,需觀察 NaN
關鍵發現
CN 較 2025-12 高峰(180 萬)有所下降但仍在 84 萬的異常水準。KR 和 US 持續惡化且未見改善趨勢。歐洲國家(FR/DE/ES/IT)為新出現的受災區。問題至今未解決。

建議過濾策略

根據排查結果,建議分三階段實施過濾。

Phase 1:UA Pattern 黑名單(立即可做,零誤殺風險)

-- 在 middledb_action.sql WHERE 條件中新增:
AND NOT REGEXP_CONTAINS(user_agent, '(?i)GuzzleHttp')
AND user_agent IS NOT NULL
國家可排除 Actions佔該國異常流量
CN837K48.8%
KR2.81M84.0%
US855K92.5%

Phase 2:UA Pattern 維護模型(中期)

新建 action_crawlers_ua 模型,維護 UA pattern 黑名單表。類似 crawlers_ip 但以 UA 為維度,可持續更新新出現的爬蟲 UA。

Phase 3:行為偵測模型(長期)

針對偽裝瀏覽器(Chrome/134 那批 UA 看似正常),需靠行為特徵識別:

  • 同 IP 不同 cookie 數 > 30/天 — 自動化 cookie 輪替
  • 單一 UA 版本佔該國 WEB 流量 > 40% — headless browser 農場
  • Session 內商品瀏覽數 > 100 — 價格爬蟲
  • Actions 時間間隔均勻無停頓 — 機器行為

結論與建議

核心發現

  • 異常流量主要來自 GuzzleHttp PHP 爬蟲(21~30%)、null User-Agent(27~81%)、偽裝 Chrome 的 headless 工具(CN 特有)
  • AI Search Bot(GPTBot、ClaudeBot、PerplexityBot)幾乎不存在(< 0.1%),非本次異常主因
  • 三國(CN/KR/US)使用完全相同的 GuzzleHttp/6.5.5 版本,高度疑似同一攻擊者或工具鏈
  • GuzzleHttp 會偽裝 IOS/ANDROID source,直接存取 APP API endpoint
  • null UA 全部集中在 WEB/MWEB source,排除不會影響 APP 用戶
  • 問題至 2026-03 仍未解決,KR 和 US 持續惡化中

優先建議

  • Phase 1(立即):在 middledb_action.sql 加入 GuzzleHttp + null UA 過濾,預估可排除 49~93% 異常流量
  • Phase 2(中期):建立 UA pattern 黑名單維護機制,持續更新
  • Phase 3(長期):建立行為偵測模型,用 cookies/IP 比率等指標識別偽裝瀏覽器

分析方法說明

使用 BigQuery 查詢 dm_tableau.tableau_order_dd_session_gross(Session/CVR 趨勢)及 dw_middledb.action(User-Agent 明細)進行排查。