要在網站上封鎖 VPN 使用者,應以 VPN 偵測 API 檢查每位訪客的 IP,再按操作分別決定:在註冊、登入及付款時,封鎖或驗證高信心分數的 VPN,一般瀏覽則予以放行。檢查可在後端以一次 API 呼叫完成,亦可毋須編寫程式碼,在網站前端透過 Cloudflare Worker、WordPress 外掛,或 Traefik、Caddy、nginx 閘道完成。一律封鎖所有 VPN 甚少是正確做法,因為不少 VPN 使用者是正當客戶。
先釐清你真正的目標
在著手實作之前,應先將目標與方法區分清楚:
- 合規 / 牌照要求:在若干地區,你或許確實需要封鎖來自匿名化 IP 的存取。
- 減少詐騙:你所需要的並非封鎖,而是在風險較高之處增加阻力。
- 防止濫用:你希望阻止的是多重帳戶及試用濫用,這關乎註冊環節,而非瀏覽行為。
大多數網站屬於第二或第三類,在這些情況下,驗證比封鎖更為合適。
檢查某個 IP 是否正在使用 VPN
第一步:可靠地偵測 VPN 流量
看不見的東西便無法採取行動。應使用能同時回傳判定結果及信心分數的偵測服務,而非單純的是/否名單。 信心分數為何重要,可參閱VPN 偵測的運作原理。 VPN 偵測 API 對任何 IP 均會回傳這兩項資料。
第二步:按操作選擇封鎖或驗證
將信心分數對應至切合該操作風險的處理方式:
| 操作 | 低分 | 中等分數 | 高分 |
|---|---|---|---|
| 閱讀內容 | 放行 | 放行 | 放行 |
| 註冊 | 放行 | 電郵/電話驗證 | 驗證 + 人工審核 |
| 登入 | 放行 | 二次認證 | 二次認證 |
| 結帳 / 提款 | 放行 | 驗證 | 封鎖或人工審核 |
如此一來,注重私隱的一般讀者不會受到任何影響,而在結帳時出現高信心分數的 VPN,則會獲得相應的嚴格 審查。
第三步:於伺服器端實作
檢查應在後端執行,而非在瀏覽器中,如此才無法被繞過,亦能令 API 金鑰維持保密。流程如下:
- 使用者觸發一項敏感操作。
- 你的伺服器以用戶端 IP 呼叫偵測 API。
- 讀取判定結果與分數,並按上表作出相應處理。
具體的實作方式,可參閱如何在 Node.js 中偵測 VPN。
無法修改後端?可在網站前端執行相同的檢查:使用Cloudflare Worker、WordPress 外掛,或Traefik、Caddy 及 nginx 整合。全部均以 Monitor 模式起步,讓你先看到哪些請求會被封鎖;封鎖功能須使用付費方案。
第四步:以評分機制取代硬性規則
若發現自己寫了大量 if 判斷式,便應加以整合。可將 VPN 訊號連同代理、Tor 及信譽資料一併納入 IP 詐騙評分,並以此單一數值作為判斷依據。此做法既較易調校,亦較難被規避。
避免誤判
- 使用分數,而非二元標記。 只在高信心分數時才施以硬性封鎖。
- 將已知的企業或雲端出口位址加入白名單,你的真實使用者往往正是合法地從這些位址存取。
- 為使用者留一條出路。 如必須封鎖,應顯示清晰的提示訊息及驗證方式,而非讓使用者陷入死路。
總結
不要封鎖所有 VPN 使用者:應先以信心分數可靠地偵測 VPN 流量,再按操作的風險決定封鎖或驗證。檢查應 於伺服器端執行,並以驗證取代硬性封鎖,同時將相關邏輯整合至單一的詐騙評分,使其能持續保持易於調校。
常見問題