* [CODE(CGI)[HTTP_[VAR[*]]]] メタ変数 (CGI) [5] [[CGI]] の[[メタ変数]]群 [DFN[[CODE(CGI)[HTTP_[VAR[*]]]]]] は、[[クライアント]]から送られてきた[[要求メッセージ]]中の[[頭欄]]を[[鯖]]が [[CGIスクリプト]]に提供するためのものです。 [6] '''メタ変数名''': [CODE(CGI)[HTTP_[VAR[*]]]] の [CODE(CGI)[[VAR[*]]]] の部分は、[[頭欄]]の[[名前]]をすべて[[大文字]]にし、 [CODE(HTTP)[-]] が含まれていればすべて [CODE(CGI)[_]] に置き換えたものとなります。例えば、 [SAMP(HTTP)[[[Accept]]:]] 欄に対応する[[メタ変数]]名は [SAMP(CGI)[[[HTTP_ACCEPT]]]] となりますし、 [SAMP(HTTP)[[[If-Modified-Since]]:]] 欄に対応するものは [SAMP(CGI)[[[HTTP_IF_MODIFIED_SINCE]]]] となります。 [7] 仕様書: = [NCSA] [[NCSA]] の元々の [[CGI/1.1]] の定義 >>6 = [[RFC 3875]] ([[CGI/1.1]]) ([[IETF]] [[情報提供]]) -- [CSECTION@en[4.1.18. Protocol-Specific Meta-Variables]] [[#comment]] ** 構文 [13] 各 [CODE(CGI)[HTTP_[VAR[*]]]] [[メタ変数]]の値には、 対応する [[HTTP]] [[要求メッセージ]]の[[頭欄]]の[[欄本体]]がそのまま入れられます。 ただし、その[[要求メッセージ]]に同じ[[欄名]]の[[頭欄]]が複数ある場合は、 [[読点]]で連結されます ([[HTTP]] の規定により、 [[読点]]で連結しても等価です)。また、 [[鯖]]は意味的に透過な変形 ([[空白]]の適当な場所への挿入・削除など) を施しても構いません。 また、[[メタ変数]]として適当であるように[[文字コード]]の変換が必要であれば行われます。 [SRC[[[RFC 3875]] 4.1.18]] [[#comment]] ** 提供されないことが多い頭欄 [14] 鯖はすべての[[頭欄]]をこの形の[[メタ変数]]として提供する必要はありません。 [SRC[[[RFC 3875]] 4.1.18]] 特に [CODE(CGI)[[[CONTENT_TYPE]]]] ([CODE(HTTP)[[[Content-Type]]]]) など他に[[メタ変数]]が用意されているもの、 [CODE(HTTP)[[[Authorization]]]] など安全上好ましくないもの、 [CODE(HTTP)[[[Connection]]]] など通信にのみ関係するものは提供されないかもしれません。 [11] >>9 に規定されているように、鯖は CGI スクリプトに要求メッセージのすべての頭欄を [CODE(CGI)[HTTP_[VAR[*]]]] メタ変数を通じて提供する必要はありません。 多くの実装では、次の頭欄は提供されません。 ,HTTP 頭欄 ,代替メタ変数 ,[CODE(HTTP)[[[Authorization]]]],[CODE(CGI)[[[AUTH_[VAR[*]]]]]] ,[CODE(HTTP)[[[Content-Length]]]],[CODE(CGI)[[[CONTENT_LENGTH]]]] ,[CODE(HTTP)[[[Content-Type]]]],[CODE(CGI)[[[CONTENT_TYPE]]]] [3] >>9 つまり、 CGI 的には [CODE(CGI)[HTTP_AUTHORIZATION]] と かが提供されていて''も''問題がないということです。 [4] >>3 でも [[Apache]] は提供してくれません。 [10] CGI メタ変数はほとんどの環境では[[環境変数]]として実装されていますが、 環境変数が安全でない環境も少なくありません。 その鯖の任意の利用者が環境変数の値を見ることができるかもしれません。 CGI で昔から認証系の頭欄が提供されないことになっているのはそのような事情があります。 [[#comment]] ** 仕様書から *** [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. これら [INS[(訳注: 他の CGI メタ変数群)]] に加えて、クライアントから受け取った[[頭行]]があれば、 これが接頭辞 [CODE(CGI)[HTTP_]] で始まって頭名が続く環境[INS[変数]]に入れられます。 頭名中の [CODE(HTTP)[[[-]]]] はすべて [CODE(CGI)[[[_]]]] に変更します。 サーバーは既に処理した頭、 例えば [CODE(HTTP)[Authorization]], [CODE(HTTP)[Content-type]], [CODE(HTTP)[Content-length]] は除いても構いません。 必要なら、サーバーはこうした頭の一部又は全部を含めるとシステムの環境制限を越える時には除いても構いません。 ***RFC 3875 (CGI/1.1) [7] [8] [9] [[RFC 3875]] 4.1.18 節を参照。 ** 安全性 [15] [[要求メッセージ]]の[[頭欄]]には安全上注意して扱うべき情報が含まれていることもあります。 >>10 のように実装方法によっては[[メタ変数]]は安全ではないので、 >>14 の通り危険な情報は提供しないなどの注意を[[鯖]]は払う必要があります。 [16] ただし >>15 のような配慮が可能なのは、 注意するべき[[頭欄]]の種類をあらかじめ[[鯖]]が把握している場合だけです。 [SAMP(HTTP)[X-Foo-Private-Information: some-important-thing]] のような[[頭欄]]を使っていると、[[鯖]]が[[メタ変数]]を生成し、 それによって [[CGI]] が使われている環境にアクセス可能な第三者に盗み見られる危険性があります。 もちろん、[Q[盗み見]]ることができる権限があるのが信頼できる限定された人だけである場合など、 必ずしも危険であるわけではありません。 このようなシステムの設計者は使用するシステムの技術的・ 運用上の性質によく注意して、 安全性と技術的な実装の簡単さや技術的整合性のバランスが取れるようにしなければなりません。 [[#comment]] ** 歴史 [17] [CODE(CGI)[HTTP_[VAR[*]]]] メタ変数群を使った[[要求]]中の一般の[[頭欄]]を [[CGIスクリプト]]に提供する方法は [[CGI/1.1]] で導入されました。 [[CGI/1.0]] では [CODE(CGI)[[[CONTENT_TYPE]]]] や [CODE(CGI)[[[HTTP_ACCEPT]]]] など一部の[[頭欄]]のみが提供されていました。 [[#comment]] ** 関連 [12] '''HTTP over TLS''': [[SSL]] や [[TLS]] の上で [[HTTP]] 通信を行っている場合であっても、 [[HTTP]] であることには変わりありませんので、 [[TCP]] 上の [[HTTP]] と同じ名前で同じように[[メタ変数]]が提供されます。 (ただし実装によってはより安全を配慮した形になっているかもしれません。) 実装によっては [[SSL]] や [[TLS]] によって得られた情報が別の[[メタ変数]]を通じて提供されています。 [DEL[ - [1] 方式 (scheme) が [[https:]] だったら ''HTTPS_[VAR[*]]'' になるんでしょうか。そんなの見たこと無いなあ。 - [2] >>1 そんなことはないです。 HTTP over SSL でも [CODE(CGI)[HTTP_[VAR[*]]]] になります。 ]DEL] [[#comment]] ** メモ [[#comment]] * [CODE[HTTP_[VAR[*]]]] 環境変数 [12] :[CODE(CGI)[[[HTTP_[VAR[*]]]]]]:[[Apache]] をはじめ多くの [[CGI]] の実装で、 [CODE(CGI)[[[HTTP_[VAR[*]]]]]] [[メタ変数]] (>>5) は同名の[[環境変数]]として実装されています。 :[CODE[[[HTTP_HOME]]]]:[[w3m]] など [[Webブラウザ]]類で[[ホーム頁]]の [[URI]] を指定する[[環境変数]]として使われています。 :[CODE[[[HTTP_PROXY]]]]:[[w3m]] など [[WWW]] 系プログラムで利用するべき[[串]]を指定する[[環境変数]]として使われています。 [[#comment]] * メモ