WinHTTP 中的 AutoProxy 問題

使用 WinHTTP autoproxy 功能時,請考慮下列重要問題。

目前僅支援一部 Proxy 伺服器

WinHTTP 目前不支援指定多個 Proxy 伺服器的 Proxy 組態。 如果 WinHttpGetProxyForUrl 傳回包含 Proxy 伺服器清單 的WINHTTP_PROXY_INFO 結構,應用程式接著會使用 WINHTTP_OPTION_PROXY 選項在要求控制碼上設定,WinHTTP 只會使用清單中的第一個 Proxy 伺服器。 如果該 Proxy 伺服器無法存取,WinHTTP 不會容錯移轉至清單中的任何其他 Proxy 伺服器。 應用程式必須再次使用清單中的下一個 Proxy 伺服器設定 WINHTTP_OPTION_PROXY 選項,然後重新傳送要求,以處理這種情況。

安全性風險降低

處理 Proxy 自動組態檔需要執行下載的腳本程式碼。 需要考慮一些安全性考慮:如果 PAC 檔案所在的伺服器遭到入侵,PAC 腳本程式碼可能是惡意的。 因此,WinHTTP 會使用下列預防措施來保護用戶端:

  1. 腳本程式碼無法具現化任何 ActiveX 物件。 這會封鎖許多潛在的危險功能,例如存取檔案和執行網路 I/O 的能力。

  2. **Windows Server 2003:**WinHttpGetProxyForUrl 會將整個 WPAD 處理委派給外部跨進程服務 WinHTTP Web Proxy 自動探索服務,此服務會以低許可權的本機服務內建使用者帳戶執行。

  3. 具有 SP2 和 Windows Server 2003 的 Windows XP: 不允許 PAC 腳本執行超過 60 秒,之後會終止腳本執行。

  4. 具有 SP2 和 Windows Server 2003 的 Windows XP: WinHTTP 會拒絕大於 1MB 的 PAC 檔案。 一般 PAC 檔案的大小通常不超過幾 KB。

請注意,處理 PAC 腳本程式碼需要使用 COM,因為 WinHTTP 會使用 Microsoft JScript 元件來執行腳本。 如果 WinHTTP 無法將 WPAD 通訊協定處理委派給外部、跨進程 Web Proxy 自動探索服務, WinHttpGetProxyForUrl 會在呼叫期間于應用程式進程內載入 COM 執行時間。 如果應用程式本身已經使用 COM,這不應該是個問題。

效能考量

自動偵測程式可能會變慢,可能只要數秒。 WinHttpGetProxyForUrlWinHttpDetectAutoProxyConfigUrl函式會封鎖同步函式。 這可能是 DHCP) 之類的一個特定自動偵測機制 (比 DNS) 等其他 (慢許多。 如果同時指定 WINHTTP_AUTO_DETECT_TYPE_DHCPWINHTTP_AUTO_DETECT_TYPE_DNS_A 自動偵測旗標,WinHTTP 會先根據 WPAD 規格使用 DHCP。 如果未透過發出 DHCP 要求來探索任何 PAC URL,WinHTTP 會嘗試在已知的 DNS 位址找到 PAC 檔案。

WinHttpGetProxyForUrl 會使用 WinHTTP 會話控制碼參數來快取 PAC 檔案和自動偵測的結果。 如果可能的話,最好對多個 WinHttpGetProxyForUrl 呼叫使用相同的會話控制碼,以避免重複的 PAC URL 偵測和檔案下載。 PAC 檔案只會在記憶體中快取,並在應用程式關閉會話控制碼時捨棄。

由於 autoproxy 的效能影響,因此建議只使用傳統型用戶端應用程式或服務使用此功能;伺服器型應用程式應該依賴伺服器管理員,並使用 「ProxyCfg.exe」 公用程式。