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の外部でプログラムを実行するために使用されます。Java SecurityManagerを使用している場合、これはcatalina.policyのセキュリティポリシー設定をバイパスします。

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

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

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

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

    特権としてマークされたContextのみがCGIサーブレットを使用できます。グローバルな$CATALINA_BASE/conf/context.xmlファイルを変更すると、すべてのWebアプリケーションに影響を与えることに注意してください。詳細については、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 - 3875 RFCのセクション4.4に従って、クエリ文字列からコマンドライン引数を生成しますか?デフォルトはfalseです。
  • environment-variable- - CGIスクリプトの実行環境に設定する環境。変数の名前は、パラメータ名から取得されます。FOOという名前の環境変数を構成するには、environment-variable-FOOという名前のパラメータを構成します。パラメータ値は、環境変数値として使用されます。デフォルトは環境変数なしです。
  • executable - スクリプトを実行するために使用する実行可能ファイルの名前。スクリプト自体が実行可能ファイル(たとえば、exeファイル)である場合は、このパラメータを明示的に空の文字列に設定できます。デフォルトはperlです。
  • executable-arg-1executable-arg-2など - 実行可能ファイルの追加引数。これらはCGIスクリプト名の前に置かれます。デフォルトでは、追加の引数はありません。
  • envHttpHeaders - 環境変数としてCGIプロセスに渡されるHTTPヘッダーを選択するために使用される正規表現。ヘッダーはマッチング前に大文字に変換され、ヘッダー名全体がパターンと一致する必要があることに注意してください。デフォルトは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プロセスを終了する前にstderrの読み取りが完了するのを待つ時間(ミリ秒単位)。デフォルトは2000です。

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

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