
curl 8.22.0 於 2026 年 9 月 2 日發布,其中包含直接涉及代理的修正:當環境變數選出的有效代理改變時,libcurl 會識別新舊端點不同,並清理快取的代理 Digest 驗證狀態。curl 專案配套的回歸測試會在同一個 easy handle 的兩次傳輸之間切換環境代理,確認第一台代理的 Digest 狀態不會被第二台重用。
這是一項範圍明確、但對長時間執行的應用很有實際意義的修正。若程式重用 libcurl easy handle,並在傳輸間修改 HTTP_PROXY、HTTPS_PROXY、ALL_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 狀態判斷成功。
安全升級測試
使用兩台已授權且身分獨立的測試代理,以及沒有真實客戶資料的受控目的端:
- 在測試環境部署 curl 8.22.0。
- 使用與生產相同的環境變數設定代理 A。
- 完成一次代理 Digest 質詢,只記錄非敏感證據。
- 不重建 easy handle,將環境代理切換至代理 B。
- 強制建立新連線,避免連線池隱藏端點變化。
- 執行第二次傳輸,確認使用代理 B 的質詢完成驗證。
- 驗證實際使用 B 閘道及預期出口。
- 補測變數優先順序和
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 僅保存於內部紀錄。
合規說明
只測試獲准使用的代理閘道與目的端。保護認證資料和質詢材料,最小化請求資料保存,遵守目的端政策及速率限制,不得利用代理切換繞過存取控制。