HTTP_*

メタ変数群 HTTP_* (CGI)

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

目次

  1. 仕様書
  2. 名前
  3. 提供されないことが多い頭欄
  4. 歴史
    1. [NCSA] での説明
    2. RFC 3875 (CGI/1.1)
  5. セキュリティー
  6. 関連
    1. HTTP/TLS、HTTP/SSL (HTTPS)
    2. SIP_ メタ変数
    3. HTTP_ 環境変数

仕様書#

名前#

[6] HTTP_** の部分は、頭欄名前をすべて大文字にし、 - が含まれていればすべて _ に置き換えたものとなります。 >>7

[20] 例えば、 Accept: 欄に対応するメタ変数名は HTTP_ACCEPT となりますし、 If-Modified-Since: 欄に対応するものは HTTP_IF_MODIFIED_SINCE となります。

[33] _ が元々頭欄名前に含まれている場合どうしたらいいのでしょう・・・。

#

[13]HTTP_* メタ変数の値には、 クライアントからの HTTP 要求頭欄欄本体がそのまま入れられます。 ただし、次に示すものも含め、意味的に等価な変形を行なって構わないことになっています。 >>7

[24] Accept-LanguageAccept_language のように本来別の頭欄が命名規則のために衝突する場合や、 複数の値を , によって意味的に等価でありつつ連結できない場合 (本来それは HTTP 違反ですが、しばしばあります。) にどうするべきかは規定されていません。 後者については実際には頭欄の種類ごとに処理を分ける意味もないでしょうから、 何も考えずに連結しているものと思われます。

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

[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 は提供してくれません。

[39] このようないびつな仕様は、 CGI/1.0 時代に HTTP_* が存在しなかったことに由来するものです。 (>>17)

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

[27] Authorization: の他、 Proxy-Authorization: も安全上注意が必要であり、提供しないことも検討するべきだと指摘されています >>26

[35] サーバーによっては、 HTTP_PROXY 環境変数に関する脆弱性を防ぐため、 Proxy: ヘッダーがあっても HTTP_PROXY メタ変数を省略するようです。

[32] WSGI と派生仕様は HTTP_*HTTP 要求頭欄に対応するべきであるとしており、 CONTENT_TYPECONTENT_LENGTH を除き、 一部の頭欄を引き渡さないことは原則として認められていないようです。 >>28, >>29, >>30, >>31

[40] WSGI 等は環境変数と異なる安全な方法でアプリケーションメタ変数を引き渡しますから、 保安に関する要件も緩められていると考えられます。

[38] SIP CGI は他の手段で取得できるものも含めすべてのヘッダーSIP_* で提供するべきと定めています。 >>36 HTTP CGI よりはかなり強い要件 (原則として提供する) となっていますが、 それでもなぜか提供しない余地を残しています。

歴史#

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

[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] RFC 3875 4.1.18 節を参照。

セキュリティー#

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

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

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

[9] HTTP_ から始まる名前の環境変数を参照するプログラムライブラリーを利用する際には、 メタ変数環境変数として設定された状態のまま呼び出してしまうことが無いよう、 注意する必要があります。

[8] http_proxy も参照してください。

[34] 環境変数 WWW_HOME の意味で HTTP_HOME が使われることがあります。

関連#

HTTP/TLS、HTTP/SSL (HTTPS)#

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

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

[19] HTTPS であることはメタ変数 HTTPS によって表されます。

SIP_* メタ変数#

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

[37] SIP_* メタ変数群は、 SIP 要求頭欄が反映されるもので、 HTTP CGI では HTTP_* メタ変数群に相当します。

[36] RFC 3050 (SIP-CGI/1.1) 5.5.1.5 Protocol-Specific Metavariables

These metavariables are specific to the protocol via which the method is sent. Interpretation of these variables depends on the value of the SERVER_PROTOCOL metavariable (see section 5.5.1.20).

これらのメタ変数群は、 method が送信されたプロトコルに特有のものです。 これらの変数の解釈は SERVER_PROTOCOL メタ変数の値に依存します。

Metavariables with names beginning with "SIP_" contain values from the message header, if the protocol used was SIP. Each SIP header field name is converted to upper case, has all occurrences of "-" replaced with "_", and has "SIP_" prepended to form the metavariable name. Similar transformations are applied for other protocols. The header data MAY be presented as sent by the client, or MAY be rewritten in ways which do not change its semantics. If multiple header fields with the same field-name are received then the server MUST rewrite them as though they had been received as a single header field having the same semantics before being represented in a metavariable. Similarly, a header field that is received on more than one line MUST be merged into a single line. The server MUST, if necessary, change the representation of the data (for example, the character set) to be appropriate for a CGI metavariable.

名前が SIP_ から始まるメタ変数群には、 使用されているプロトコルが SIP である時にメッセージ頭からの値を設定します。 各 SIP 頭欄名は大文字に変換され、 全ての -_ に置換し、 SIP_ を頭につけてメタ変数名を形成します。 同様の変換が他のプロトコルにも適用されます。 頭データはクライアントから送られたままにしても構いません (MAY) し、その意味を変更しない範囲で書き換えても構いません (MAY)。 同じ欄名の複数の頭欄を受信した時は、 サーバーはメタ変数として表現する前にこれを書き換えて同じ意味を持つ単一の頭欄を受信したようにしなければなりません (MUST)。 同様に、複数行で受信した頭欄は単一行に併合しなければなりません (MUST)。 サーバーは、必要であれば、 データの表現 (例えば文字集合) を変更して CGI メタ変数として適切なものとしなければなりません (MUST)

Note: these metavariables' names were changed from HTTP_* to SIP_* since the first draft of this specification. The intention had been to make it easier to use existing CGI libraries unmodified, but this convenience was felt to be outweighed by the confusion this introduced.

注意: これらのメタ変数群の名前は、 この仕様書の最初の原案から、 HTTP_* から SIP_* に変更しました。 その意図は、既存の CGI ライブラリを修正せずに使用することを用意とすることにありますが、 この便宜はこれが招く混乱より価値があると感じられます。

Servers are not required to create metavariables for all the message header fields they receive. However, because of the relatively high importance of headers in SIP for messages' semantic content, the server SHOULD provide all headers which do not contain potentially sensitive authorization information, such as Authorization. Servers SHOULD provide protocol-specific metavariables even for information which is available through other SIP CGI metavariables, such as CONTENT_LENGTH and CONTENT_TYPE.

サーバーに対してその受信した全てのメッセージ頭欄に関してメタ変数を作成することは要求していません。 しかし、 SIP においてメッセージの意味内容に頭が比較的高い重要性を持つことから、 サーバーは繊細な認証情報を含む可能性がある Authorization のようなものの他は全ての頭欄を提供するべきです (SHOULD)。 サーバーは、他の SIP CGI メタ変数、例えば CONTENT_LENGTHCONTENT_TYPE から利用可能な情報であっても、 プロトコル特有メタ変数を提供するべきです (SHOULD)

This allows a SIP CGI script to determine, if necessary, whether the information in the other metavariables was in the original message, or was synthesized by the server.

これによって SIP CGI が必要であれば他のメタ変数の情報が元のメッセージにあったものか、 それともサーバーが生成したものかを判断できます。

HTTP_* 環境変数#

[12]

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