網際網路用戶端切換代理閘道並清理舊連線狀態

curl 8.22.0 於 2026 年 9 月 2 日發布,其中包含直接涉及代理的修正:當環境變數選出的有效代理改變時,libcurl 會識別新舊端點不同,並清理快取的代理 Digest 驗證狀態。curl 專案配套的回歸測試會在同一個 easy handle 的兩次傳輸之間切換環境代理,確認第一台代理的 Digest 狀態不會被第二台重用。

這是一項範圍明確、但對長時間執行的應用很有實際意義的修正。若程式重用 libcurl easy handle,並在傳輸間修改 HTTP_PROXYHTTPS_PROXYALL_PROXY 或對應小寫變數,就應把此切換納入 8.22.0 升級測試。它不代表建議所有程式在執行中修改環境變數。

具體改變

修正前,從環境讀取的代理設定可能在兩次傳輸間改變,但先前端點相關的代理 Digest 狀態不一定被視為失效。8.22.0 會追蹤上一條環境代理字串;新的有效代理不同時,先清理舊的代理 Digest 狀態再繼續連線。

Digest 是質詢—回應驗證,狀態可能包含特定代理提供的 realm、nonce 等資訊。這些狀態屬於發出質詢的代理。即使兩台代理使用同一帳號或同一服務商,也不應把一台的驗證狀態帶到另一台。

發布說明只承諾偵測變更並清理狀態,不代表應用層容錯移轉會自動正確。DNS、連線重用、認證資料範圍、NO_PROXY、大小寫變數優先順序與並行控制仍需個別驗證。

哪些應用應優先測試

若程式會重用 easy handle、從環境取得代理、在程序不重新啟動時修改變數、於閘道或區域間切換、使用代理 Digest 驗證,或以 worker、agent、桌面程式及嵌入式服務長期執行,應提高測試優先順序。

啟動時環境固定、只做一次請求就結束的命令較少觸發此轉換。透過 libcurl API 明確設定代理的應用走另一條配置路徑,但仍應測試端點與認證資料邊界。

為何切換代理就是驗證邊界

外觀相似的代理 URL 也可能屬於不同信任域和政策域,回傳不同的 Digest realm、nonce、演算法或存取決策。主機名稱、連接埠、HTTP/HTTPS 代理方案、使用者名稱、認證資料範圍、區域、供應商、環境變數優先順序,以及 NO_PROXY 匹配變化,都應視為邊界。

邊界變更後,要驗證實際路由、驗證交換、連線身分與出口位址,不能只靠單一 HTTP 狀態判斷成功。

安全升級測試

使用兩台已授權且身分獨立的測試代理,以及沒有真實客戶資料的受控目的端:

  1. 在測試環境部署 curl 8.22.0。
  2. 使用與生產相同的環境變數設定代理 A。
  3. 完成一次代理 Digest 質詢,只記錄非敏感證據。
  4. 不重建 easy handle,將環境代理切換至代理 B。
  5. 強制建立新連線,避免連線池隱藏端點變化。
  6. 執行第二次傳輸,確認使用代理 B 的質詢完成驗證。
  7. 驗證實際使用 B 閘道及預期出口。
  8. 補測變數優先順序和 NO_PROXY 場景。

可記錄 UTC 時間、代理主機名稱或不透明閘道 ID、回應類別、驗證方法、連線是否重用及預期區域。不可記錄代理密碼、授權標頭、Cookie、完整 Digest 回應或客戶內容。

更完整的重用檢查可參考HTTP/2 代理連線重用稽核,認證資料變更則參考代理認證資料輪替指南

環境變數變更不等於執行緒安全

許多平台的環境變數是程序級全域狀態。多執行緒或並行傳輸期間修改變數,可能產生應用層競態,而這不是 curl 程式庫修正能消除的。一次傳輸可能讀到與另一次不同的值,程序內其他元件也可能依賴同一變數。

條件允許時,優先採用程序啟動後不變的設定。確需動態選路時,明確的每 handle 代理設定通常比修改全域環境更容易推理。無論採用哪種模型,都要定義所有權、同步變更並測試並行傳輸。

回歸測試矩陣

  • 代理 A 切到 B:B 發出並完成自己的驗證交換。
  • 同一代理的新請求:依應用政策有效重用。
  • 代理變數被取消:執行已記錄的回退或直連政策。
  • 開始匹配 NO_PROXY只在明確預期時略過代理。
  • 停止匹配 NO_PROXY使用目標代理並重新完成驗證。
  • 主機不變但連接埠改變:視為不同端點。
  • IPv4 與 IPv6 路徑改變:仍可驗證目標閘道與出口。
  • 並行傳輸:不存在跨請求競態或認證資料暴露。

應在最舊支援執行環境和 TLS 後端測試,而非只測開發者電腦。容器、服務管理器、桌面系統和 CI 對代理變數的繼承及正規化方式可能不同。

漸進上線建議

先升級一小組 worker,比較舊版本的代理驗證失敗、新建連線、延遲、重試量、路由選擇和有效結果。端點切換時新建連線短暫變化可能合理;持續出現 407 或實際閘道錯誤則不是。

回復應恢復上一版應用映像及已知設定,同時保留 8.22.0 測試證據。不得透過關閉代理驗證、把秘密寫入 URL 或紀錄、擴大存取規則來繞過問題。

營運檢查清單

  • curl 8.22.0 已在全量升級前測試。
  • 有效代理變數及優先順序已記錄。
  • 同一 handle 的 A 到 B 轉換已涵蓋。
  • 第二台代理使用獨立且已授權的質詢。
  • 新連線證明實際抵達新端點。
  • 已按需涵蓋 NO_PROXY、取消變數、連接埠、IPv4 與 IPv6。
  • 避免或同步控制並行環境修改。
  • 紀錄不含認證資料與驗證材料。
  • 金絲雀指標包含有效業務結果。
  • 回復不會削弱驗證或路由控制。

常見問題

curl 8.22.0 是否要求使用環境變數?

不是。修正只影響 libcurl 從環境取得代理設定的場景。明確 API 設定仍可用,也可能更適合動態路由。

這是否只影響 curl 命令列?

變更位於 libcurl 的 URL 與代理狀態處理,因此重用 handle 的嵌入式應用也可能相關。應測試實際交付的建置和整合。

此修正會輪替代理密碼嗎?

不會。它只在環境選定代理改變時清理快取的代理 Digest 狀態,認證資料生命週期仍由應用負責。

可以直接修改生產環境變數測試嗎?

應先使用測試環境或小型金絲雀。程序級環境變更會影響並行工作,因此需要隔離流量並控制影響。

來源說明

來源:curl 專案《Changes in 8.22.0》及《url: detect proxy changes read from environment》,發布日期為 2026 年 9 月 2 日。具體研究 URL 僅保存於內部紀錄。

合規說明

只測試獲准使用的代理閘道與目的端。保護認證資料和質詢材料,最小化請求資料保存,遵守目的端政策及速率限制,不得利用代理切換繞過存取控制。