HTTP_*

メタ変数 HTTP_* (CGI)

[5] CGIメタ変数HTTP_* は、クライアントから送られてきた要求メッセージ中の頭欄CGIスクリプトに提供するためのものです。

[6] メタ変数名: HTTP_** の部分は、頭欄名前をすべて大文字にし、 - が含まれていればすべて _ に置き換えたものとなります。例えば、 Accept: 欄に対応するメタ変数名は HTTP_ACCEPT となりますし、 If-Modified-Since: 欄に対応するものは HTTP_IF_MODIFIED_SINCE となります。

[7] 仕様書:

  1. [NCSA] NCSA の元々の CGI/1.1 の定義 >>6
  2. RFC 3875 (CGI/1.1) (IETF 情報提供)
    • 4.1.18. Protocol-Specific Meta-Variables

構文

[13]HTTP_* メタ変数の値には、 対応する HTTP 要求メッセージ頭欄欄本体がそのまま入れられます。 ただし、その要求メッセージに同じ欄名頭欄が複数ある場合は、 読点で連結されます (HTTP の規定により、 読点で連結しても等価です)。また、 は意味的に透過な変形 (空白の適当な場所への挿入・削除など) を施しても構いません。 また、メタ変数として適当であるように文字コードの変換が必要であれば行われます。 RFC 3875 4.1.18

提供されないことが多い頭欄

[14] 鯖はすべての頭欄をこの形のメタ変数として提供する必要はありません。 RFC 3875 4.1.18 特に CONTENT_TYPE (Content-Type) など他にメタ変数が用意されているもの、 Authorization など安全上好ましくないもの、 Connection など通信にのみ関係するものは提供されないかもしれません。

[11] >>9 に規定されているように、鯖は CGI スクリプトに要求メッセージのすべての頭欄を HTTP_* メタ変数を通じて提供する必要はありません。 多くの実装では、次の頭欄は提供されません。

HTTP 頭欄代替メタ変数
AuthorizationAUTH_*
Content-LengthCONTENT_LENGTH
Content-TypeCONTENT_TYPE

[3] >>9 つまり、 CGI 的には HTTP_AUTHORIZATION と かが提供されていて問題がないということです。

[4] >>3 でも Apache は提供してくれません。

[10] CGI メタ変数はほとんどの環境では環境変数として実装されていますが、 環境変数が安全でない環境も少なくありません。 その鯖の任意の利用者が環境変数の値を見ることができるかもしれません。 CGI で昔から認証系の頭欄が提供されないことになっているのはそのような事情があります。

仕様書から

[NCSA] での説明

[6]

In addition to these, the header lines received from the client, if any, are placed into the environment with the prefix HTTP_ followed by the header name. Any - characters in the header name are changed to _ characters. The server may exclude any headers which it has already processed, such as Authorization, Content-type, and Content-length. If necessary, the server may choose to exclude any or all of these headers if including them would exceed any system environment limits.

これら (訳注: 他の CGI メタ変数群) に加えて、クライアントから受け取った頭行があれば、 これが接頭辞 HTTP_ で始まって頭名が続く環境変数に入れられます。 頭名中の - はすべて _ に変更します。 サーバーは既に処理した頭、 例えば Authorization, Content-type, Content-length は除いても構いません。 必要なら、サーバーはこうした頭の一部又は全部を含めるとシステムの環境制限を越える時には除いても構いません。

RFC 3875 (CGI/1.1)

[7] [8] [9] RFC 3875 4.1.18 節を参照。

安全性

[15] 要求メッセージ頭欄には安全上注意して扱うべき情報が含まれていることもあります。 >>10 のように実装方法によってはメタ変数は安全ではないので、 >>14 の通り危険な情報は提供しないなどの注意をは払う必要があります。

[16] ただし >>15 のような配慮が可能なのは、 注意するべき頭欄の種類をあらかじめが把握している場合だけです。 X-Foo-Private-Information: some-important-thing のような頭欄を使っていると、メタ変数を生成し、 それによって CGI が使われている環境にアクセス可能な第三者に盗み見られる危険性があります。

もちろん、盗み見ることができる権限があるのが信頼できる限定された人だけである場合など、 必ずしも危険であるわけではありません。 このようなシステムの設計者は使用するシステムの技術的・ 運用上の性質によく注意して、 安全性と技術的な実装の簡単さや技術的整合性のバランスが取れるようにしなければなりません。

歴史

[17] HTTP_* メタ変数群を使った要求中の一般の頭欄CGIスクリプトに提供する方法は CGI/1.1 で導入されました。 CGI/1.0 では CONTENT_TYPEHTTP_ACCEPT など一部の頭欄のみが提供されていました。

関連

HTTP/TLS、HTTP/SSL (HTTPS)

[12] SSLTLS の上で HTTP 通信を行っている場合 (いわゆる HTTPS) であっても、 HTTP であることには変わりありませんので、 TCP 上の HTTP と同じ名前で同じようにメタ変数が提供されます。 (ただし実装によってはより安全を配慮した形になっているかもしれません。) 実装によっては SSLTLS によって得られた情報が別のメタ変数を通じて提供されています。

  • [1] 方式 (scheme) が https: だったら HTTPS_* になるんでしょうか。そんなの見たこと無いなあ。
  • [2] >>1 そんなことはないです。 HTTP over SSL でも HTTP_* になります。

SIP_* メタ変数

[18] SIP CGI では SIP 要求メッセージメタ変数 SIP_* として提供されます。

HTTP_* 環境変数

[12]

HTTP_*
Apache をはじめ多くの CGI の実装で、 HTTP_* メタ変数 (>>5) は同名の環境変数として実装されています。
HTTP_HOME
w3m など Webブラウザ類でホーム頁URI を指定する環境変数として使われています。
HTTP_PROXY
w3m など WWW 系プログラムで利用するべきを指定する環境変数として使われています。