將每個免費代理視為不受信任的基礎設施,因為它確實如此。運營者是匿名的,資金模式不明確,同一個 socket 可能在一週內輪流經過 botnet、被入侵的家用路由器以及研究人員的蜜罐。這些都不代表免費代理無法使用——而是讓一小部分習慣成為不可妥協的條件。
常見攻擊
這些威脅並不戲劇化。它們是那種無聊的類型,之所以成功是因為大多數使用者懶得防範。
明文 HTTP 上的憑證竊取。 如果你透過未知代理透過 http:// 登入任何東西,運營者就會看到密碼。務必透過 CONNECT 隧道傳輸 TLS,或使用 SOCKS 連接到本身強制使用 HTTPS 的目標。現代主要網站的登入流程僅限 HTTPS,但舊的內部網路、IoT 管理頁面和舊版 CMS 部署則不然。
標頭與內容注入。 惡意的 HTTP 代理可以改寫你請求的任意部分:更改 cookie、交換 referrer、注入追蹤參數,或移除快取標頭。同一個代理也可以將內容注入回應——將腳本注入 HTML、將重新導向注入 JSON、將廣告注入靜態頁面。如果你透過代理讀取伺服器端回應,在能從可信路徑驗證完整性之前,都應視為已被入侵。
透過 SOCKS5 的 DNS 劫持。 SOCKS5 可以在代理端解析主機名稱。如果代理對 DNS 記錄說謊,你就會連接到運營者控制的伺服器。盡可能設定你的客戶端在本機解析:curl --resolve example.com:443:93.184.216.34,或在程式碼中傳遞 IP 而非主機名稱。
流量記錄。 即使是善意的代理也可能記錄你抓取的每個 URL。對於包含「這個人請求了哪些 URL」的威脅模型,每個公共代理都是錯誤的工具。請使用 Tor 或具有公開無日誌政策且有過抗爭傳票記錄的付費 VPN。
針對客戶端的資源耗盡。 有些代理故意將連線限速到極慢、回傳非常大的回應,或保持 socket 開啟但不發送資料。請在你的客戶端設定嚴格的回應大小限制和連線逾時。
防禦措施(按優先順序)
透過 CONNECT 將所有內容放在 TLS 內傳送,或透過 SOCKS 傳送到 HTTPS 目標。絕不要在公共代理後面重複使用你在其他地方也會重複使用的憑證。嚴格驗證憑證——對於隨意使用而言,固定發行者是過度設計,但接受任何憑證鏈則是魯莽。設定較短的連線和讀取逾時。當工作負載重要時,記錄代理回應以供鑑識審查。頻繁輪換;五分鐘前還能用的代理,現在不一定還是同一個代理。
免費代理的真正用途
三類工作值得忍受這些干擾。測試地理內容差異:你的 CDN 從法蘭克福與聖保羅提供的頁面是否正確?抓取公開、未經認證的資料:搜尋引擎結果、沒有 IP 速率限制的公開 API、已在其他地方建立索引的內容。驗證你的應用程式在其對外 IP 對目標而言不熟悉時是否正確運作——對於具有基於 IP 的詐欺啟發式規則的系統的 QA 很有用。
就用它們來做這些事。接受失敗率。不要把任何你會介意失去的東西放在它們後面。