CGI の使い方

目次

はじめに

CGI (Common Gateway Interface) は、Webサーバーが外部のコンテンツ生成プログラム(CGIプログラムまたはCGIスクリプトとよく呼ばれる)と対話する方法を定義します。

Tomcat 内では、Tomcat を HTTP サーバーとして使用し、CGI サポートが必要な場合に CGI サポートを追加できます。これは通常、Apache httpd のような Web サーバーを実行したくない開発中に実行されます。Tomcat の CGI サポートは Apache httpd のものとほぼ互換性がありますが、いくつかの制限があります (例: cgi-bin ディレクトリは1つのみ)。

CGI サポートは、サーブレットクラス org.apache.catalina.servlets.CGIServlet を使用して実装されています。従来、このサーブレットは URL パターン "/cgi-bin/*" にマッピングされます。

Tomcat では、CGI サポートはデフォルトで無効になっています。

インストール

注意 - CGI スクリプトは、Tomcat JVM の外部にあるプログラムを実行するために使用されます。

CGI サポートを有効にするには

  1. デフォルトの $CATALINA_BASE/conf/web.xml ファイルには、CGI サーブレットのサンプルサーブレットおよびサーブレットマッピング要素がコメントアウトされています。Web アプリケーションで CGI サポートを有効にするには、そのサーブレットとサーブレットマッピングの宣言を Web アプリケーションの WEB-INF/web.xml ファイルにコピーしてください。

    $CATALINA_BASE/conf/web.xml ファイル内のサーブレットとサーブレットマッピングのコメントを解除すると、インストールされているすべてのウェブアプリケーションでCGIが一度に有効になります。

  2. Web アプリケーションの Context 要素に privileged="true" を設定します。

    privileged とマークされた Context のみが CGI サーブレットを使用できます。グローバルな $CATALINA_BASE/conf/context.xml ファイルを変更すると、すべてのウェブアプリケーションに影響することに注意してください。詳細については、Context ドキュメントを参照してください。

設定

CGI サーブレットの動作を設定するために使用できるいくつかのサーブレット初期化パラメータがあります。

  • cgiMethods - カンマ区切りのHTTPメソッドのリスト。これらのメソッドのいずれかを使用するリクエストは、スクリプトが応答を生成するためにCGIスクリプトに渡されます。デフォルト値は GET,POST です。スクリプトがメソッドに関係なくすべてのリクエストを処理するには * を使用します。このパラメータの設定によって上書きされない限り、HEAD、OPTIONS、またはTRACEを使用するリクエストはスーパークラスによって処理されます。
  • cgiPathPrefix - CGI検索パスは、Webアプリケーションのルートディレクトリ + File.separator + このプレフィックスから開始します。デフォルトでは値がないため、Webアプリケーションのルートディレクトリが検索パスとして使用されます。推奨値は WEB-INF/cgi です。
  • cmdLineArgumentsDecoded - コマンドライン引数が有効になっている場合(enableCmdLineArguments経由)でTomcatがWindows上で実行されている場合、個々のデコードされたコマンドライン引数はこのパターンに一致する必要があります。一致しない場合、リクエストは拒否されます。これは、JavaからWindowsにコマンドライン引数を渡す際の既知の問題から保護するためです。これらの問題は、リモートコード実行につながる可能性があります。これらの問題の詳細については、Markus Wulftangeのブログと、アーカイブされたDaniel Colascioneのブログを参照してください。
  • cmdLineArgumentsEncoded - コマンドライン引数が有効になっている場合(enableCmdLineArguments経由)、個々のエンコードされたコマンドライン引数はこのパターンに一致する必要があります。一致しない場合、リクエストは拒否されます。デフォルトはRFC3875で定義された許可値に一致し、[\w\Q%;/?:@&,$-.!~*'()\E]+ です。
  • enableCmdLineArguments - RFC 3875のセクション4.4に従って、クエリ文字列からコマンドライン引数が生成されますか?デフォルトは false です。
  • environment-variable- - CGI スクリプトの実行環境に設定される環境変数。変数名はパラメータ名から取得されます。FOO という名前の環境変数を設定するには、environment-variable-FOO という名前のパラメータを設定します。パラメータ値が環境変数の値として使用されます。デフォルトでは環境変数は設定されません。
  • executable - スクリプトを実行するために使用される実行可能ファイルの名前。スクリプト自体が実行可能ファイルである場合(例: exeファイル)、このパラメータを明示的に空の文字列に設定できます。デフォルトは perl です。
  • executable-arg-1, executable-arg-2 など - 実行可能ファイル用の追加引数。これらはCGIスクリプト名の前に置かれます。デフォルトでは追加引数はありません。
  • envHttpHeaders - HTTPヘッダーを環境変数としてCGIプロセスに渡すために使用される正規表現。ヘッダーはマッチングの前に大文字に変換され、ヘッダー名全体がパターンに一致する必要があることに注意してください。デフォルトは ACCEPT[-0-9A-Z]*|CACHE-CONTROL|COOKIE|HOST|IF-[-0-9A-Z]*|REFERER|USER-AGENT です。
  • parameterEncoding - CGI サーブレットで使用されるパラメータエンコーディングの名前。デフォルトは System.getProperty("file.encoding","UTF-8") です。これはシステムデフォルトのエンコーディング、またはシステムプロパティが利用できない場合はUTF-8です。
  • passShellEnvironment - Tomcat プロセスからのシェル環境変数(もしあれば)はCGIスクリプトに渡されるべきですか?デフォルトは false です。
  • stderrTimeout - CGIプロセスを終了する前に、標準エラー出力の読み取りが完了するのを待つ時間(ミリ秒単位)。デフォルトは 2000 です。

実行されるCGIスクリプトは、CGIサーブレットの設定と、リクエストがCGIサーブレットにどのようにマッピングされるかに依存します。CGI検索パスは、Webアプリケーションのルートディレクトリ + File.separator + cgiPathPrefix から開始します。その後、pathInfonull でない限り検索され、null の場合は servletPath が検索されます。

検索は最初のパスセグメントから始まり、スクリプトが見つかるか、パスセグメントがなくなる(結果として404となる)まで、一度に1つのパスセグメントを展開します。残りのパスセグメントは、PATH_INFO 環境変数でスクリプトに渡されます。