[BUG] Location ヘッダーと組み合わせると CGI で Set-Cookie ヘッダーが無視される

文書翻訳 文書翻訳
文書番号: 176113 - 対象製品
この記事は、以前は次の ID で公開されていました: JP176113
マイクロソフトでは、Microsoft Windows Server 2003 で実行される Microsoft インターネット インフォメーション サービス (IIS) 6.0 にアップグレードすることを、すべてのユーザーに強く推奨します。IIS 6.0 により、Web インフラストラクチャのセキュリティが大幅に強化されます。IIS のセキュリティ関連のトピックについては、次のマイクロソフト Web サイトを参照してください。
http://www.microsoft.com/japan/technet/security/prodtech/iis.mspx
すべて展開する | すべて折りたたむ

目次

現象

CGI アプリケーションが "302 Object Moved" 応答および Location ヘッダーと共に Set-Cookie ヘッダーを送信すると、Internet Information Server (IIS) によって Cookie ヘッダーが無視されます。

解決方法

この動作は CGI の仕様に違反しています。CGI の仕様には、「サーバー命令ではないヘッダーはすべて、クライアントに直接送り返されます。現在、この仕様では 3 つのサーバー命令を定義しています...」と記載されています。

回避策としては、EXE ファイルを nph- で始まる名前にして、すべての HTTP ヘッダーを直接プログラム側で作成します。EXE ファイルを nph- で始まる名前にすることによって、その CGI プログラムが解析対象外ヘッダー モードで実行されるものであることをサーバーに示します。CGI には 2 つのモードがあります。通常のモード (解析対象ヘッダー) では、CGI 命令 (Content-type、Location、または Status) のいずれかを標準出力に送信する必要があります。送信した命令に基づいて、CGI によって有効な HTTP 応答行がフォーマットされます。その他の標準的な HTTP ヘッダーは自動的にフォーマットされ、指定したその他のヘッダーもすべて含まれます。

もう 1 つのモードは、解析対象外ヘッダー モードです。このモードでは、CGI 自体ではヘッダーの設定は行われません。応答行およびすべてのヘッダーを含む完全な HTTP 応答を CGI プログラムでフォーマットする必要があります。このモードでは、サーバーによるヘッダーの追加や修正は行われません。

規則では、名前が nph- で始まる CGI プログラムは解析対象外ヘッダー モードで実行され、それ以外の CGI プログラムは解析対象ヘッダー モードで実行されます。

状況

マイクロソフトでは、この問題をこの資料の冒頭に記載したマイクロソフト製品の問題として認識しています。

詳細

現象の再現手順

この CGI プログラムを Win32 Console Application としてコンパイルし、IIS サーバー上の実行可能なフォルダに入れます。
#include <stdio.h>
int main()
{
  printf("Location: %s\r\n", "http://www.yahoo.com");
  printf("Set-Cookie: Name1=Value1; path=/;expires=Fri, 22 May 1998 21:00:00 GMT\r\n\r\n");
  return 0;
}
				

この CGI プログラムをブラウザから呼び出し、その出力を (ネットワーク モニタなどを使用して) 監視します。出力は以下のようになります。
HTTP/1.0 302 Object moved
Location: http://www.yahoo.com
Server: Microsoft-IIS/2.0
Content-Type: text/html
Content-Length: 145

<head><title>Document moved</title></head>
<body><h1>Object Moved</h1>This document may be found
<a HREF="http://www.yahoo.com">here</a></body>
				

IIS によって Set-Cookie ヘッダーが送信されていないことに注意してください。ブラウザで Cookie の警告を有効にした場合でも、警告は表示されません。

Cookie が 302 応答で設定されるようにするには、以下のようなコードを使用し、実行可能ファイルを nph- で始まる名前にします。
#include <stdio.h>
int main()
{
  printf("HTTP/1.0 302 Redirect\r\n");
  printf("Location: %s\r\n", "http://www.yahoo.com");
  printf("Set-Cookie: Name=Value; path=/; expires=Fri, 22 May 1998 21:00:00
   GMT\r\n\r\n");
  return 0;
}
				

出力は以下のようになります。ここで Cookie が送信され、サーバーによるヘッダーの追加は行わないことに注意してください。
HTTP/1.0 302 Redirect
Location: http://www.yahoo.com
Set-Cookie: Name=Value; path=/; expires=Fri, 22 May 1998 21:00:00 GMT
				

関連情報

(c) Microsoft Corporation 1997, All Rights Reserved. Contributions by Leon Braginski, Microsoft Corporation

プロパティ

文書番号: 176113 - 最終更新日: 2005年11月29日 - リビジョン: 4.2
この資料は以下の製品について記述したものです。
  • Microsoft Internet Information Server 3.0
  • Microsoft Internet Information Server 4.0
  • Microsoft Internet Information Services 5.0
キーワード:?
kbbug kbnofix KB176113
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com