WinHTTP 安全性考慮
下列安全性考慮適用於使用 WinHTTP 的應用程式:
- 每個會話只會驗證伺服器證書一次。 驗證憑證之後,在目前會話的持續時間內仍有效。 只要憑證指紋相符,這表示憑證尚未變更,憑證就會繼續重新驗證。 因此,驗證準則中的任何變更,透過通訊協定、撤銷檢查或憑證錯誤忽略旗標,在驗證憑證後不會生效。 若要強制這類變更立即生效,則必須結束目前的會話,並啟動新的會話。 同樣地,只有在應用程式本身定期檢查證書伺服器以擷取到期數據時,才能偵測會話期間憑證的到期時間。
- 自動 Proxy 牽涉到下載和執行腳本。 自動 Proxy 探索支援牽涉到透過 DHCP 或 DNS、下載和執行 Proxy 腳本,例如 Java 腳本。 若要達到更高的安全性程度,應用程式必須避免傳遞 WINHTTP_AUTOPROXY_RUN_INPROCESS 旗標,讓自動 Proxy 探索開始跨進程。 即便如此,如果腳本無法正確執行進程外,WinHTTP 預設會嘗試執行自動 Proxy 腳本。 如果您認為此後援行為造成無法接受的風險,請使用 WINHTTP_AUTOPROXY_RUN_OUTPROCESS_ONLY 旗標停用後援行為。
- WINHTTP_STATUS_CALLBACK函式必須立即傳回。 當您撰寫其中一個回呼函式時,請小心不要封鎖。 例如,回呼與其呼叫的任何函式都不應該顯示使用者對話框或等候事件。 如果WINHTTP_STATUS_CALLBACK函式確實封鎖,它會影響 WinHTTP 的內部排程,並導致相同進程內的其他要求遭到拒絕服務。
- WINHTTP_STATUS_CALLBACK函式必須重新進入。 撰寫回呼時,請避免靜態變數或其他在重新進入下不安全的建構,並避免呼叫其他未重新進入的函式。
- 如果可能進行異步操作,請傳遞 OUT 參數的 NUL。 如果您已註冊回呼函式來啟用異步操作,請一律針對 WinHttpQueryDataAvailable 的 lpdwDataAvailable、WinHttpReadData 的 lpdwBytesRead 或 WinHttpWriteData 的 lpdwBytesWritten 等 OUT 參數傳遞 NULL 值。 在某些情況下,呼叫線程會在作業完成之前終止,如果 OUT 參數不是 NULL,則函式最後可能會寫入已釋放的記憶體。
- Passport 驗證不是萬無一失的。 任何以 Cookie 為基礎的驗證配置都容易受到攻擊。 Passport 1.4 版是以 Cookie 為基礎,因此受限於與任何 Cookie 或窗體型驗證配置相關聯的弱點。 WinHTTP 預設會停用 Passport 支援;您可以使用 WinHttpSetOption 來啟用它。
- 基本身份驗證只能用於安全連線。 以純文本傳送使用者名稱和密碼的基本身份驗證(請參閱 RFC 2617),應該只透過加密的 SSL 或 TLS 連線使用。
- 將 [自動登入原則] 設定為 [低] 可能會造成風險。 當自動登入原則設定為低時,使用者登入認證可以用來對任何網站進行驗證。 不過,針對您不信任的網站進行驗證不是很好的安全性做法。
- 除非明確啟用,否則不會使用SSL 2.0連線。 TLS 1.0 和 SSL 3.0 安全性通訊協議被視為比 SSL 2.0 更安全。 根據預設,WinHTTP 會在交涉 SSL 連線時要求 TLS 1.0 或 SSL 3.0,而不是 SSL 2.0。 WinHTTP 中的 SSL 2.0 支援只能藉由呼叫 WinHttpSetOption 來啟用。
- 必須明確要求憑證撤銷檢查。 根據預設,執行憑證驗證時,WinHTTP 不會檢查伺服器的憑證是否已撤銷。 您可以使用 WinHttpSetOption 來啟用憑證撤銷檢查。
- 應用程式必須確保會話對應至單一身分識別。 WinHTTP 會話應該對應至一個身分識別;也就是說,WinHTTP 會話可用來管理單一已驗證使用者的因特網活動,或一組匿名使用者。 不過,由於 WinHTTP 不會自動強制執行此對應,因此您的應用程式必須採取步驟,以確保只涉及單一身分識別。
- 應同步處理 WinHTTP 要求句柄上的作業。 例如,應用程式應該避免在一個線程上關閉要求句柄,而另一個線程正在傳送或接收要求。 若要終止異步要求,請在回呼通知期間關閉要求句柄。 若要終止同步要求,請在先前的 WinHTTP 呼叫傳回時關閉句柄。
- 追蹤檔案包含敏感性資訊。 追蹤檔案會使用訪問控制清單 (ACL) 來保護,因此通常只能由本機系統管理員或建立它的用戶帳戶存取。避免透過任何未經授權的存取來危害追蹤檔案。
- 避免透過 WinHttpSetOption 傳遞敏感數據。 請勿提供使用者名稱、密碼或任何其他認證給 WinHttpSetOption ,因為您無法控制所使用的驗證配置,而且敏感數據可能會以純文本傳送。 使用 WinHttpQueryAuthSchemes 和 WinHttpSetCredentials 而非 WinHttpSetOption 來設定認證。
- 自動重新導向可能會造成安全性風險。 根據預設,即使 POST 也會自動遵循重新導向 (302 訊息)。 為避免出現虛假重新導向的可能性,應用程式應該在張貼敏感性資訊時停用自動重新導向或監視回呼中的重新導向。
- 使用者定義標頭會在未變更的重新導向之間傳輸。 使用者定義的標頭,例如使用 WinHTTPAddRequestHeaders 新增的 Cookie,會在不修改的情況下跨重新導向傳輸,而 WinHTTP 所產生的標頭會自動更新。 如果在重新導向之間傳送使用者定義標頭會造成安全性風險,請使用 WINHTTP_STATUS_CALLBACK 回呼搭配 WINHTTP_CALLBACK_STATUS_REDIRECT 完成,以在發生重新導向時修改有問題的標頭。
- WinHTTP 不會在同步模式中重新進入。 因為 WinHTTP 不是在同步模式中重新進入,因此請勿排程可以在 WinHTTP 函式內執行的應用程式線程上呼叫 WinHTTP 的異步過程調用 (APC)。 在同步模式中,WinHTTP 會執行「可警示的等候」,如果等候的線程已預先清空以執行 APC,然後稍後再次重新輸入 WinHTTP,WinHTTP 的內部狀態可能會損毀。