[1] CGI のメタ変数は、 要求についての情報を鯖からCGIスクリプトに提供するものです。 一般的にはオペレーティング・システムの環境変数として実装されています。
[22] メタ変数には名前があります。変数名は大文字・小文字不区別です。
CGI 仕様においては大文字と _
の正準形で表されていますが、
実際の名前はシステム定義となっています。 >>38
[42] 構文上はプロトコルや URL scheme 依存、あるいは CGI 本体仕様に含まれない拡張されたメタ変数の名前として
token
で使えるすべての文字が使えることになっています。また、
長さ制限もありません。 >>38
meta-variable-value = "" | 1*<TEXT, CHAR or tokens of value>... と定義されています >>38。更に個別のメタ変数ごとに更に詳細な構文が定義されています。
[39] 鯖からCGIスクリプトへどのようにCGIメタ変数を引き渡すかはシステム定義です >>38。
[51] メタ変数の値の文字をどのように表現するかはシステム定義です。 鯖はその表現に変換しなければなりません。 >>38
[21] サーバーはスクリプトにメタ変数を渡す方法を用意しなければなりません。 多くの実装では環境変数として渡されます。
[18] WinCGI ではINIファイルを使ってメタ変数を渡していたそうです。 (INI のファイル名は CGI スクリプトの第1引数となります。) (WinCGI が他の点でちゃんと CGI に適合するのかは知りませんが。)
[50] CGI では空文字列のことを NULL といいます。更に、空文字列と値が無い、 値が設定されていないことを区別しません。
[4] HTTP CGI では歴史的に両者を基本的には区別しませんが、 SIP CGI ではその区別を要求しています。
[58] QUERY_STRING
, SCRIPT_NAME
に関しては例外 (かもしれない) 規定があります。
[56] メタ変数はそれぞれの構文と意味が規定されていますが、クライアントからの要求によってそれが定まる場合、 クライアントがプロトコルの仕様に従っていない場合にはメタ変数も同様に仕様に従っていないこともあります。
[44] GATEWAY_INTERFACE
, REMOTE_ADDR
,
SERVER_NAME
など、 CGI や鯖、あるいはクライアントの情報を提供するメタ変数や、
CONTENT_TYPE
など要求についての情報を提供するメタ変数があります。
[45] URL scheme と同名のメタ変数や、URL scheme またはプロトコルの名前から始まるメタ変数も存在します。 >>38 そのようなメタ変数は、当該プロトコル特有の情報を提供します。
[59] 鯖はプロトコルと URL scheme に依存したメタ変数を設定するべきです。
その解釈は SERVER_PROTOCOL
に示されたプロトコルの版に拠ります。 >>60
[5] 次のものがあります。
[46] 例えば HTTP というプロトコルにおいては、 HTTP_USER_AGENT
という名前のメタ変数が
HTTP 要求メッセージの User-Agent:
欄の値を提供することになっています。
[61] 鯖は URL scheme とプロトコルが異なるときに URL scheme と同名のメタ変数を非 NULL 値に設定して構いません。 >>60
[8] 次のものがあります。
[62] AmigaDOS ではメタ変数は同名の環境変数としてCGIスクリプトに渡されます。
CGIスクリプトからは DOS ライブラリーの GetVar()
によりアクセスできます。 flags 引数は 0 とするべきです。
大文字・小文字不区別ですが、区別するシステムとの互換性ために大文字を使うべきです。
>>63
[64] Unix や POSIX 互換のシステムではメタ変数は同名の環境変数として
CGIスクリプトに渡されます。
CGIスクリプトからは C ライブラリーの getenv()
や変数 environ によりアクセスできます。 >>63
大文字と小文字は区別されます。
[65] Windows ではメタ変数は同名の環境変数としてCGIスクリプトに渡されます。 大文字・小文字不区別ですが、区別するシステムとの互換性のために大文字を使うべきです。
[16] 元々の CGI の他に、 WSGI や PSGI や P6W などの派生仕様でも、 メタ変数の仕組みが継承されています。ただし、細かくはそれぞれの規定があって、 統一されていません。
[24] Apache では要求の処理の際にメタ変数が環境変数と設定され、
CGI に限らず用いられています。 httpd.conf
や .htaccess
の指令 (mod_rewrite
の RewriteRule
など) や、
mod_perl のPerlスクリプトや mod_php の PHPスクリプトなどからも環境変数が参照されます。
[72] A Guide to the Internet Connection Servers - SG244805.PDF, , http://ps-2.kev009.com/rs6000/redbook-cd/SG244805.PDF#page=284
cgi+:
scheme を使った CGI スクリプト呼び出し[14] よく CGI 環境変数
として取り上げられるが CGI とは関係のない (たまたま設定されているだけの) 変数:
[15] こういうのを CGI 環境変数として挙げているような解説は参考にしない方が身のためです。
TZ
のようにたまたまそのサーバーで設定されていただけの環境変数が載っていたりします。筆者がちゃんとわかっているかを判断する一つの材料となります。*
のめた変数をきちんと区別して扱っているかも要注意でしょう。厳しいことを言えば、このメタ変数群と HTTP 頭欄の関係に全く触れていなければその時点で HTTP CGI の説明として失格です。環境変数はブラウザが送る
と思っている人がいます。仕組みを知らない証拠です。[2] [NCSA] では環境変数とされていましたが、 [COAR] では CGI の普及を反映して、 より汎用的にメタ変数と呼んでいます。 Un|x や Windoze のような環境で、 Apache や IIS などを使っている場合など、 ほとんどの場合においてはメタ変数の手段として環境変数が使われますから、 現在でも環境変数で情報を伝えていると表現することは間違いではありませんが、 特に実装に依存した話をする場合以外は [COAR] を尊重してメタ変数と呼ぶのがよいとおもいます。 RFC3050 もメタ変数と呼んでいます。
[3] メタ変数は、サーバーから CGI スクリプトへの情報伝達にのみ使われます。 変数の値を変更しても、サーバーの動作などに影響は出ません。 (メタ変数の手段によっては変更すること自体できないかもしれません。)
[49] HTTP CGI であっても、
NULL
と値なしは
「実装依存」であって、
適当でよいわけではありません。
例えばサーバーはある時
QUERY_STRING
が
[31] mod_rewrite - shima111の日記 ( 版) http://d.hatena.ne.jp/shima111/20070125/p1
[67] ESI Language Specification 1.0 ( ( 版)) http://www.w3.org/TR/esi-lang
[68] XQuery 3.0: An XML Query Language ( ( 版)) http://www.w3.org/TR/xquery-30/#dt-environment-variables
[69] Bash specially-crafted environment variables code injection attack | Red Hat Security ( ( 版)) https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/
[10] specifications/spore_implementation.pod at master · SPORE/specifications ( 版) https://github.com/SPORE/specifications/blob/master/spore_implementation.pod#the-request-environment
[12] Bash specially-crafted environment variables code injection attack | Red Hat Security ( ( 版)) https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/
[25] XPath and XQuery Functions and Operators 3.1 () https://www.w3.org/TR/2017/REC-xpath-functions-31-20170321/#func-environment-variable
[26] Remove parse error on NULLs from input stream preprocessing stage (inikulin著, ) https://github.com/whatwg/html/commit/8fa65b73575ed692ec7f75665bde32134acc4dd6
[27] EventSource: ignore IDs with U+0000 by annevk · Pull Request #2849 · whatwg/html () https://github.com/whatwg/html/pull/2849
[28] Make U+0000 a parse error in bogus comment and bogus DOCTYPE states (zcorpan著, ) https://github.com/whatwg/html/commit/5a6fef58056832140fecf1580ca815f385730cec
[29] Parse errors on NULLs in bogus comment. · Issue #2684 · whatwg/html () https://github.com/whatwg/html/issues/2684
[30] Make U+0000 a parse error in bogus comment and bogus DOCTYPE states by zcorpan · Pull Request #2939 · whatwg/html () https://github.com/whatwg/html/pull/2939
[70] Editorial: Clarify what happens to U+0000 chars (sideshowbarker著, ) https://github.com/whatwg/html/commit/05d0ae71e82871e2fd1785829d180218da83abe7
[71] Editorial: Clarify what happens to U+0000 chars by sideshowbarker · Pull Request #2968 · whatwg/html () https://github.com/whatwg/html/pull/2968
SERVER_NAME
をserver-name
,serverName
,SERVER.NAME
,SERVER NAME
など一定の規則で変形させたものもシステムごとの表現の範囲内として認められるものと思われます。