クライアントからの要求で、WWWサーバーで処理を行い、結果を返す仕組みを総称してCGIと呼びます。CGIの仕組み
CGIスクリプトの指定
ブラウザURL →
← HTML
WWWサーバー起動 →
← 結果
CGIプログラム
CGIでは、ブラウザから指定されたCGIプログラムをWWWサーバーが起動し、結果を再びWWWサーバーを介してブラウザへ渡します。WWWサーバーは通常、環境変数を通してCGIプログラムにデータを渡します。
CGIスクリプトとして使用するプログラムは主にPerl, シェルなどがあります。スクリプトがCGIとして実行されるには、出力の先頭に Content-type 指定が必要になります。CGIスクリプトのデータ受け取り
HTML Content-type: text/html GIF Content-type: image/gif
HTMLからのデータをCGIへ渡すとき、<FORM>を使用します。CGIの環境変数<FORM METHOD="POST" ACTION="./cgi-bin/scripts.cgi">METHODアトリビュートはデータの送受信方法で、GETまたは何も指定されなかった場合は、環境変数 QUERY_STRING を介してデータの受け渡しを行うことができます。
if ($ENV{'REQUEST_METHOD'} ne "POST") { $Data = $ENV{'QUERY_STRING'}; }
METHODアトリビュートにPOSTが指定された場合、標準入力でデータが渡されます。環境変数 CONTENT_LENGTH にはデータの長さが入っているので、この長さ分だけ標準入力から読み取るようにします。
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $Data, $ENV{'CONTENT_LENGTH'}); # STDIN は標準入力 }
環境変数はWWWサーバーで自動的にセットされます。ですが、すべてのWWWサーバーで共通ではありません。CGIは危険
CONTENT_TYPE データの種類 CONTENT_LENGTH POSTメソッド時のデータの長さ DOCUMENT_ROOT サーバー文書のルートディレクトリ GATEWAY_INTERFACE CGIのバージョン HTTP_ACCEPT ブラウザが許可しているContent-type HTTP_REFERER 直前に参照していたURL HTTP_USER_AGENT ブラウザのバージョン PATH_INFO 外部パス情報 QUERY_STRING GETメソッド時のデータ REMOTE_ADDR クライアントのIPアドレス REMOTE_HOST クライアントホスト名 REMOTE_USER クライアントユーザー名 REQUEST_METHOD クライアントの要求メソッド
CGIは危険性を秘めています。例えば掲示板などのスクリプトで、HTMLタグを有効にしておく場合、</HTML>などと行われると、掲示板のHTMLタグが終了してしまい、満足な結果が得られなくなります。イメージなどでも、巨大なサイズのイメージを貼り付けられると、読み込みに大変な時間がかかってしまいます。
このため、掲示板などではHTMLタグを無効にしておく方が安全性が高いといえます。