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 參數的 DLL。 如果您已註冊回呼函式來啟用非同步作業,請一律針對WinHttpQueryDataAvailable、WinHttpReadDatalpdwBytesRead for WinHttpReadData傳遞這類 OUT 參數的Null值,或針對WinHttpWriteData傳遞lpdwBytesWritten 在某些情況下,呼叫執行緒會在作業完成之前終止,如果 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 呼叫傳回時關閉控制碼。
  • 追蹤檔案包含敏感性資訊。 追蹤檔案會使用Access-Control清單 (ACL 保護) ,以便一般只能由本機系統管理員或建立它的使用者帳戶存取。避免任何未經授權的存取危害追蹤檔案。
  • 避免透過WinHttpSetOption傳遞敏感性資料。 請勿提供使用者名稱、密碼或任何其他認證給 WinHttpSetOption ,因為您沒有使用之驗證配置的控制權,而且敏感性資料可能會意外以純文字傳送。 使用 WinHttpQueryAuthSchemesWinHttpSetCredentials 而非 WinHttpSetOption 來設定認證。
  • 自動重新導向可能會造成安全性風險。 根據預設,即使 POST 會自動遵循 302 訊息) 重新導向 (。 為了避免假性重新導向的可能性,應用程式應該在張貼敏感性資訊時停用自動重新導向或監視回呼中的重新導向。
  • 使用者定義標頭會在重新導向之間不變更傳輸。 使用 WinHTTPAddRequestHeaders新增的 Cookie 等使用者定義的標頭會在重新導向之間傳輸,而 WinHTTP 所產生的標頭會自動更新。 如果跨重新導向傳輸使用者定義的標頭會造成安全性風險,請使用 WINHTTP_STATUS_CALLBACK 回呼搭配 WINHTTP_CALLBACK_STATUS_REDIRECT 完成,以在發生重新導向時修改有問題的標頭。
  • WinHTTP 不會在同步模式中重新進入。 因為 WinHTTP 不是在同步模式中重新進入,所以請勿排程非同步過程呼叫 (APC) ,在 WinHTTP 函式內執行的應用程式執行緒上呼叫 WinHTTP。 在同步模式中,WinHTTP 會執行「可警示的等候」,而且如果等候執行緒已預先清空以執行 APC,然後稍後再次重新輸入 WinHTTP,WinHTTP 的內部狀態可能會損毀。