Win の新機能HTTP 5.1

このトピックでは、WinHTTP バージョン 5.1 とバージョン 5.0 の最も重要な違いについて説明します。 これらの違いの多くは、バージョン 5.0 からバージョン 5.1 に移行するアプリケーションでコードを変更する必要があります。 バージョン 5.1 の一部の機能は、Windows Server 2003 および Windows XP Service Pack 2 (SP2) 以降でのみ使用できます。特に、悪意のある Web サーバーに対するクライアントのセキュリティの向上に関連する機能です。

重要

WinHTTP バージョン 5.1 のリリースでは、WinHTTP 5.0 のダウンロードは使用できなくなります。 2004 年 10 月 1 日の時点で、Microsoft は WinHTTP 5.0 SDK のダウンロードを MSDN から削除し、バージョン 5.0 の製品サポートを終了しました。

 

DLL 名の変更

新しい WinHTTP 5.1 DLL の名前はWinhttp.dllされますが、WinHTTP 5.0 DLL の名前はWinhttp5.dll。

WinHTTP 5.0 と 5.1 は同じシステム上で共存できます。WinHTTP 5.1 では、WinHTTP 5.0 を置き換えたり、インストールしたりすることはありません。

再配布

WinHTTP 5.1 は、Windows Server 2003、Windows 2000 Professional Service Pack 3 (SP3)、Windows XP Service Pack 1 (SP1)、以降のオペレーティング システムでのみ使用できます。 WinHTTP 5.1 では、再頒布可能マージ モジュール (.msm) ファイルを使用できません。

WinHttpRequest ProgID

WinHttpRequest コンポーネントの ProgID が "WinHttp.WinHttpRequest.5" から "WinHttp.WinHttpRequest.5.1" に変更されました。 WinHttpRequest クラスの CLSID も変更されました。

非同期コールバック動作の変更

非同期モードで WinHttpWriteDataWinHttpQueryDataAvailableおよび WinHttpReadData 関数を呼び出すときは、設定する lpdwNumberOfBytesWrittenlpdwNumberOfBytesAvailablelpdwNumberOfBytesRead OUT パラメーターに依存しないでください。 関数呼び出しが非同期的に完了した場合、WinHTTP はアプリケーション コードによって提供されるこれらのポインターに書き込まれません。 代わりに、アプリケーションは、コールバック関数に 対して lpvStatusInformation パラメーターと dwStatusInformationLength パラメーターを使用してこれらの値を取得する必要があります。

[既定の設定] の変更

既定の設定に対する変更は次のとおりです。

  • WinHTTP 5.1 では、SSL サーバー証明書の検証が既定で有効になっています。 WinHTTP 5.0 では、サーバー証明書を致命的なエラーとして検証するときに発生したエラーは処理されません。 これらは、SECURE_FAILURE コールバック通知を使用してアプリケーションに報告されますが、要求が中止されることはありません。 WinHTTP 5.1 は、サーバー証明書の検証エラーを、要求を中止する致命的なエラーとして処理します。 アプリケーションは、 WINHTTP_OPTION_SECURITY_FLAGS オプションを使用して、不明な CA、無効/有効期限切れの証明書の日付、または無効な証明書サブジェクト名などの証明書エラーの小さなサブセットを無視するように WinHTTP に指示できます。
  • WinHTTP 5.1 では、パスポート認証のサポートは既定で無効になっています。 passport のサポートは、 WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH オプションを使用して有効にすることができます。 キーリングでのパスポート資格情報の自動検索も、既定では無効になっています。
  • リダイレクト動作の変更: セキュリティで保護された https: URL から通常の http: URL への HTTP リダイレクトは、セキュリティ上の理由から既定で自動的にフォローされなくなりました。 WinHTTP 5.1 の既定のリダイレクト動作をオーバーライドするための新しいオプションWINHTTP_OPTION_REDIRECT_POLICYがあります。 WinHttpRequest COM コンポーネントでは、新しいWinHttpRequestOption_EnableHttpsToHttpRedirects オプションを使用して、https: から http: URL へのリダイレクトを有効にします。
  • WinHTTP トレース ファイルが作成されると、管理者のみがファイルの読み取りまたは書き込みを行うことができるよう ACL を使用してアクセスが制限されます。 トレースファイルが作成されたユーザー アカウントは、ACL を変更して他のユーザーにアクセス権を付与することもできます。 この保護は、セキュリティをサポートするファイル システムでのみ使用できます。つまり、FAT32 ではなく NTFS)。
  • Windows Server 2003 および WINDOWS XP sp2 以降では、HTTP 以外の既知のポートへの要求の送信は、セキュリティ上の理由から制限されます。21 (FTP)、25 (SMTP)、70 (GOPHER)、110 (POP3)、119 (NNTP)、143 (IMAP) です。
  • Windows Server 2003 および WINDOWS XP SP2 以降では、HTTP 応答で WinHTTP が受け入れるヘッダー データの最大量は、既定で 64K です。 サーバーの HTTP 応答に含まれるヘッダー データの合計が 64K を超える場合、WinHTTP は ERROR_WINHTTP_INVALID_SERVER_RESPONSE エラーで要求を失敗させます。 この 64K の制限は、新しい WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE オプションを使用してオーバーライドできます。

IPv6 のサポート

WinHTTP 5.1 では、インターネット プロトコル バージョン 6 (IPv6) のサポートが追加されています。 WinHTTP は、DNS 名が IPv6 アドレスに解決されるサーバーに HTTP 要求を送信でき、Windows Server 2003 以降では SP2 を使用する Windows XP、WinHTTP では IPv6 リテラル アドレスもサポートされます。

C/C++ API for WinHTTP の新しいオプション

WinHTTP 5.1 には、次の新しいオプションが実装されています。

"\#define WINHTTP\_OPTION\_PASSPORT\_SIGN\_OUT 86" "\#define WINHTTP\_OPTION\_PASSPORT\_RETURN\_URL 87" "\#define WINHTTP\_OPTION\_REDIRECT\_POLICY 88"

Windows Server 2003 および Windows XP SP2 以降、WinHTTP 5.1 には次の新しいオプションが実装されています。 ただし、WINDOWS 2000 Professional SP3 または Windows XP SP1 では、次のオプション ID を使用して WinHttpSetOption または WinHttpQueryOption を呼び出す失敗します。

"\#define WINHTTP\_OPTION\_RECEIVE\_RESPONSE\_TIMEOUT 7" "\#DEFINE WINHTTP\_OPTION\_MAX\_HTTP\_AUTOMATIC\_REDIRECTS 89" "\#DEFINE WINHTTP\_OPTION\_MAX\_HTTP\\ _STATUS\_CONTINUE 90" "\#DEFINE WINHTTP\_OPTION\_MAX\_RESPONSE\_HEADER\_SIZE 91" "\#define WINHTTP\_OPTION\_MAX\_RESPONSE\_DRAIN\_SIZE 92"

WinHttpRequest 5.1 コンポーネントの新しいオプション

WinHttpRequest 5.1 コンポーネントには、次の新しいオプションが実装されています。

"WinHttpRequestOption\_RevertImpersonationOverSsl" "WinHttpRequestOption\_EnableHttpsToHttpRedirects" "WinHttpRequestOption\_EnablePassportAuthentication"

次の新しい WinHttpRequest 5.1 オプションは、Windows Server 2003 以降、Windows XP SP2 以降で使用できます。

"WinHttpRequestOption\_MaxAutomaticRedirects" "WinHttpRequestOption\_MaxResponseHeaderSize" "WinHttpRequestOption\_MaxResponseDrainSize" "WinHttpRequestOptions\_EnableHttp1\_1"

自動ログオン セキュリティが [高] に設定されている場合、プロキシは信頼されません

WinHTTP 5.0 では、プロキシ サーバーは常に自動ログオンに対して信頼されます。 これは、WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH ポリシー オプションが設定されている場合、Windows Server 2003 および Windows XP with SP2 で実行されている WinHTTP 5.1 では無効になります。

Web プロキシ自動検出 (AutoProxy) API

WinHTTP ベースのアプリケーションのプロキシ設定の構成を容易にするために、WinHTTP は Web プロキシ自動検出 (WPAD) プロトコル ( autoproxy とも呼ばれます) を実装するようになりました。 これは、インターネット エクスプローラーなどの Web ブラウザーが実装するプロトコルと同じで、エンドユーザーがプロキシ サーバーを手動で指定しなくても、プロキシ構成を自動的に検出します。 Autoproxy をサポートするために、WinHTTP 5.1 では、新しい C/C++ 関数 WinHttpGetProxyForUrl と、 WinHttpDetectAutoProxyConfigUrlWinHttpGetIEProxyConfigForCurrentUser という 2 つのサポート関数が実装されています。

既知の問題

Windows 2000 Professional SP3 の WinHTTP 5.1 と SP1 の Windows XP には、次の問題が存在することがわかっています。 Windows Server 2003 以降の WinHTTP と SP2 を使用した Windows XP では、次の問題が解決されます。

  • アプリケーションが WinHttpRequest コンポーネントの WinHttpSetTimeouts 関数または SetTimeouts メソッドを使用して dwResolveTimeout パラメーターなどの無限ではない DNS 解決タイムアウトを設定する場合、WinHTTP が DNS 名を解決するたびにスレッド ハンドル リークが発生します。 多数の HTTP 要求に対して、これによりメモリ リークが大幅に発生します。 回避策は、既定の無限解決タイムアウト設定を変更せずに残すことです (値 0 は無限タイムアウトを指定します)。 これは、WinHTTP での DNS 名前解決のサポート タイムアウトはパフォーマンスの面で高コストであるため、いずれの場合も強くお勧めします。 Windows 2000 以降では、基になる DNS クライアント サービスによって独自の解決タイムアウトが実装されるため、WinHTTP で DNS 解決タイムアウトを設定する必要は不要です。
  • 非同期要求を処理する場合、WinHTTP はスレッドの偽装を適切に処理しません。 これにより、 資格情報が WinHttpSetCredentials 関数または WinHttpSetOption 関数を使用して明示的に指定されていない限り、NTLM/Negotiate 認証を必要とする要求は失敗します。