[5] CGI のメタ変数群 HTTP_*
は、クライアントから送られてきた要求メッセージ中の頭欄を鯖が
CGIスクリプトに提供するためのものです。
[6] メタ変数名:
HTTP_* の *
の部分は、頭欄の名前をすべて大文字にし、
- が含まれていればすべて _
に置き換えたものとなります。例えば、
Accept: 欄に対応するメタ変数名は
HTTP_ACCEPT となりますし、
If-Modified-Since: 欄に対応するものは
HTTP_IF_MODIFIED_SINCE となります。
[7] 仕様書:
[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 頭欄 | 代替メタ変数 |
Authorization | AUTH_* |
Content-Length | CONTENT_LENGTH |
Content-Type | CONTENT_TYPE |
[3] >>9 つまり、 CGI 的には HTTP_AUTHORIZATION と かが提供されていても問題がないということです。
[10] CGI メタ変数はほとんどの環境では環境変数として実装されていますが、 環境変数が安全でない環境も少なくありません。 その鯖の任意の利用者が環境変数の値を見ることができるかもしれません。 CGI で昔から認証系の頭欄が提供されないことになっているのはそのような事情があります。
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
は除いても構いません。
必要なら、サーバーはこうした頭の一部又は全部を含めるとシステムの環境制限を越える時には除いても構いません。
[15] 要求メッセージの頭欄には安全上注意して扱うべき情報が含まれていることもあります。 >>10 のように実装方法によってはメタ変数は安全ではないので、 >>14 の通り危険な情報は提供しないなどの注意を鯖は払う必要があります。
[16] ただし >>15 のような配慮が可能なのは、 注意するべき頭欄の種類をあらかじめ鯖が把握している場合だけです。 X-Foo-Private-Information: some-important-thing のような頭欄を使っていると、鯖がメタ変数を生成し、 それによって CGI が使われている環境にアクセス可能な第三者に盗み見られる危険性があります。
もちろん、盗み見
ることができる権限があるのが信頼できる限定された人だけである場合など、
必ずしも危険であるわけではありません。
このようなシステムの設計者は使用するシステムの技術的・
運用上の性質によく注意して、
安全性と技術的な実装の簡単さや技術的整合性のバランスが取れるようにしなければなりません。
[17] HTTP_* メタ変数群を使った要求中の一般の頭欄を
CGIスクリプトに提供する方法は CGI/1.1
で導入されました。 CGI/1.0 では CONTENT_TYPE
や HTTP_ACCEPT など一部の頭欄のみが提供されていました。