[2] [[CGI]] では、[[システム]]によっては[[CGIスクリプト]]の[[引数]]として特定の
[CODE(CGI)@en[[[QUERY_STRING]]]] を構文解析したものを渡すことになっています。

* 仕様書

[REFS[
- [11] [CITE@en[RFC 3875 - The Common Gateway Interface (CGI) Version 1.1]] 
-- [3] '''<http://tools.ietf.org/html/rfc3875#section-4.4>'''
-- [12] <http://tools.ietf.org/html/rfc3875#section-7>
]REFS]

* 文脈

[5] 元々この機能は [CODE(HTMLe)@en[isindex]] [[要素]]による[[問い合わせ]]が
[[URL query]] として送信されたものを処理することを想定していました。

[15] [CODE(HTMLe)@en[isindex]] [[要素]]は[[フォーム]]の登場により90年代に既に使われなくなり、
[TIME[2016年][year:2016]]までに [[Webブラウザー]]および[[仕様書]]でも完全に廃止されました。

[16] 理論上は [CODE(HTMLe)@en[isindex]] [[要素]]以外でも [[URL query]]
で同じような形式を採っていれば[[サーバー]]側の処理に使うことはできるのですが、
あまり一般的ではありません。

[17] 最早誰も [[CGI]] の[[仕様書]]をメンテナンスしていないため、
かつての規定が依然として形式的に有効ではあるのですが、実際上は誰も使っていない本機能も
[CODE(HTMLe)@en[isindex]] [[要素]]と共に廃止されたものとして扱うべきでしょう。

;; [18] 同じ情報は[[メタ変数]] [CODE(CGI)@en[QUERY_STRING]] でアクセスできるのですから、
本機能は不要です。

* 処理

[4] [[HTTP]] の [CODE(HTTP)@en[[[GET]]]] や [CODE(HTTP)@en[[[HEAD]]]] の[[要求]]であって、
[[URL]] の [[query]] が[[パーセント符号化]]されてい''ない'' [CODE(URI)[[[=]]]]
を含んでい''ない''場合、この機能が有効になります。 [SRC[>>3]]

[5] [[鯖]]は [[query]] を次の[[生成規則]]に従うものとして構文解析する[['''べきです''']] [SRC[>>3]]。
[PRE(ABNF code)[
      search-string = search-word *( "+" search-word )
      search-word   = 1*schar
      schar         = unreserved | escaped | xreserved
      xreserved     = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "," |
                      "$"
]PRE]

;; [6] これに適合しない場合どうするべきかは明記されていません。

[7] >>5 によって構文解析した後、各 [CODE(ABNF)[search-word]] を[[パーセント復号]]し、
必要があれば[[システム定義]]の方法で符号化し、[[命令行]]の[[引数]]として使います。
[SRC[>>3]]

[8] この[[引数]]リストの一部または全部を構成できないときは[[命令行]]の引数をまったく生成しては[['''なりません''']]。
例えば[[引数]]の数が[[OS]]の制限を超えたとか、[[引数]]として表現できない語が存在するとかです。
[SRC[>>3]]

[9] [[CGIスクリプト]]は [CODE(CGI)@en[[[QUERY_STRING]]]] が [CODE(URI)[[[=]]]]
を含むかどうか検査し、含む場合は[[命令行]]を使わない[['''べきです''']]。 [SRC[>>3]]

;; [10] そもそも常に [CODE(CGI)@en[[[QUERY_STRING]]]] を使えば良い気がしますが・・・。

* SIP CGI の場合

[1] [[SIP]] CGI では、命令行[[引数]]は使用する'''べきではない ([[SHOULDNOT]])''' とされています。 [RFC 3050 5.4]

* 束縛

** POSIX

[13] [[Unix]] と [[POSIX]] 環境では、[[命令行]]は [CODE[[[main()]]]] [[関数]]の[[引数]]
[CODE[[[argc]]]]、[CODE[[[argv]]]] によりアクセスできます。 [[Bourne shell]]
で「[RUBYB[[[活性]]]@en[active]]」な[[文字]]は [CODE(char)[[[\]]]] で[[エスケープ]]されます。
[SRC[>>12]]

** その他

[14] [[AmigaDOS]] について [[RFC]] にはなぜか言及がありませんが、提供されないということでしょうか。

[19] [[WSGI]] や [[PSGI]] ではこの機能に相当するものは用意されていないようです。

* セキュリティー

[20] [[UNIX]] では、 [CODE[ps]] [[コマンド]]など[[プロセス]]の一覧で[[コマンドライン引数]]が外部から観測可能です。
[[第三者]]が[[プロセス]]一覧にアクセス可能な環境では、注意が必要です。