WWW/WWWサーバによる情報公開 - 応用編/SSI,CGI

ここでは,SSI (Server Side Include)やCGI (Common Gateway Interface),フォーム機能の概念や記述の方法を説明し,アクセスカウンタや訪問者リストなどの利用例を紹介します.これらの機能の詳細は,市販のマニュアルなどを参照してください.

4.2.1 SSI

通常,ページの送信要求を受けると,WWWサーバはページをそのまま送信します.しかし,ページの中でも拡張子が`.shtml'のファイルの送信を要求された場合,WWWサーバはそのページの中の一部に,現在時刻や他のページの内容などを挿入してからWWWブラウザに向けて送信します.このように,送信直前にページに何らかの情報を挿入する機能をSSI (Server Side Include)と呼びます(図4.6).ページの中にSSIを記述するには,次の書式を用います.

<!--#COMMAND TAG1="VALUE1" TAG2="VALUE2" -->


図 4.6:SSIの機能
図 4.6:SSIの機能

COMMANDには次のものを指定します.

  • CONFIG
    SSIで取り込む情報の形式を指定します.

<!-#config errmsg="エラーメッセージ"->
 SSIでエラーが発生した場合、ここで設定したメッセージが出力される。
<!-#config timefmt="%y/%m/%d/%H:%M"-->
#echoや#flastmodで日時を表示する際の形式指定。
 

  • ECHO
    サーバで設定されている変数の取り込みを行います.

このファイルの名前は<!-#echo var="DOCUMENT_NAME" ->です.
現在時刻は<!-#echo var="DATE_LOCAL" ->です.

  • INCLUDE
    あるページの中に別のページの内容を挿入します.

来訪者リスト<p>
<!-#INCLUDE VIRTUAL="list.txt" ->

  • FLASTMOD
    ファイルの最終更新時期を表示します.
このページは<p>
<!-#FLASTMOD VIRTUAL="list.html" ->に更新されました.
link.htmlは<p>
<!-#FLASTMOD VIRTUAL="/~t01000tf/link.html" ->
に更新されました.

現在時刻は <!-#EXEC CMD="date" ->です <br>
あなたは<!-#EXEC CGI="counter.cgi" ->人目のお客様です.

SSIを利用するページのファイル名の拡張子は`.shtml'にしてください.

4.2.2 CGI,フォーム機能

通常,WWWブラウザからページの送信要求を受けると,WWWサーバはページをそのまま送信します.しかし,CGIを利用したファイル(拡張子が`.cgi' などのプログラム)の送信要求を受けた場合,WWWサーバはそのプログラムを実行することで何らかの処理を行い,その結果生成されるページや画像などをWWWブラウザに向けて送信します(図4.7).また,フォーム機能によりユーザから送られてきた情報を処理する場合にもCGIを利用します.


図 4.7:CGIの概念
図 4.7:CGIの概念

このように,CGIとはWWWサーバとサーバで実行されるプログラムとの橋渡しをするインタフェースです.実際の処理はサーバのプログラムが行い,その結果をWWWサーバを通じてブラウザに送信します.このWWWサーバで実行されるプログラムをCGIプログラムと呼びます.CGIプログラムを記述する言語(Perl,Cなど) はWWWサーバで実行できるものであれば何でもよいですが,文字列の処理に優れ,WWWサーバが置き換えられてもプログラムを変更せずにそのまま実行でき,セキュリティを考慮したプログラムが書きやすいという理由から,ここではPerlによるCGIプログラムを説明します.

CGIプログラムのファイルは 拡張子を`.cgi'にして, public_html以下のディレクトリに置きます.CGIプログラムのファイルはWWWサーバにより実行されるので,chmodコマンドを使用し,すべてのユーザに対して実行可能な設定にしておかなければなりません.同様に,CGIプログラムが実行中に書き込みを行うファイルなどもすべてのユーザに対して書き込み可能な設定にしてください.

% pwd<RET>
/home/t01000tf/public_html
% chmod 755 sample.cgi<RET>
% ls -l sample.cgi<RET>
-rwxr-xr-x 1 t01000tf 4103 Jun 30 07:11 sample.cgi
% _

CGIプログラムを利用する際の注意

CGIプログラムは,WWWサーバでプログラムとして実行されるので,適切に利用しないと非常に危険です.次に,CGIプログラムを書くときの注意点を挙げます.CGIプログラムのセキュリティについては,`The World Wide Web Security FAQ'(http://www.w3.org/Security/)を参照してください.

  • CGIプログラムのファイルをchmodコマンドを使用して保護モードを変更するときに,自分以外の書き込みは不可にする.
  • フォームから入力された文字列をコマンドとして実行したり,コマンドの引数として実行するようなCGIプログラムを書かないこと.
  • PerlでCGIプログラムを書くときは,必ず-Tオプションをつける.Perlを-Tオプションをつけて起動すると,厳しいセキュリティチェックを行うので安全である.(図4.9参照)
  • WWWサーバに大きな負荷をかけるようなCGIプログラムは書かない.

フォーム機能

フォーム機能を利用すると,ユーザが入力した文字などの情報をWWWサーバにあるCGIプログラムに送信できます.これにより,CGIプログラムはユーザからの情報に応じたインタラクティブな処理ができます.この機能を利用したページを作成するには,<form>タグ,<input>タグなどを使用します.

1.
<form>タグ
<form>タグではaction属性にユーザが送信する情報を処理するCGIプログラムをURLで指定します.

<form action="CGIプログラムのURL">
<input....>
</form>

2.
<input>タグ
<input>タグにより,送信する情報を入力するフィールドを作成し ます. <input>タグは,<form>タグと</form>タ グに囲まれた領域に記述してください.

<input type="入力フィールドの種類" name="変数名" size="数値">

  • type属性
    入力フィールドの種類を指定します.入力フィールドには図4.8のような種類があります.


    図 4.8:入力フィールドの種類
    図 4.8:入力フィールドの種類

  • NAME属性
    name属性で指定する変数名は,フィールド全体の識別子としてCGIプログラムに送信されます.type属性が submitreset以外の場合は必ず指定しなければいけません.

  • value属性
    submitの場合,submitボタンに表示されるラベルを指定します.また, radiocheckboxの場合は,各々のボタンの識別子を指定します.

4.2.3 SSI,CGIの利用例

ここでは,SSIによりCGIプログラムを実行する例として,アクセスカウンタの作成方法を紹介します.アクセスカウンタとは,それが設置されたページがアクセスされた回数を数える機能です.

アクセスカウンタを作成する際に必要となる2つのファイルを次に示します.これらはWWWサーバによりアクセスされるので,public_htmlディレクトリの下に作成し,さらに,用途に応じて各ファイルの保護モードをchmodコマンドを使って変更しなければいけません.

1.
4.9の内容でcounter.cgiという名前のCGIプログラムを作成し,すべてのユーザに対して実行可能となるように保護モードを設定します.
2.
中身が0という数字と改行コードのみのnumber.txtという名前のテキストファイルを作成し,すべてのユーザに対して書き込み可能となるように保護モードを設定します.

% chmod  755  counter.cgi<RET>
% echo 0 >number.txt<RET>
% chmod  666  number.txt<RET>
% _

以上のファイルを準備したら,public_htmlディレクトリの下にアクセスカウンタを設置するページを作成し,次の1行を記述します.なお,このアクセスカウンタはSSIを利用しているので,これを埋め込むページのファイルの拡張子は`.shtml'でなければいけません.

あなたは<!-#EXEC CGI="counter.cgi" ->人目です.

アクセスカウンタを設置したぺージをWWWブラウザで表示すると,先の一行を記述した部分に``あなたは1人目です.''と表示されます.以後,このページがアクセスされる度にこの数値は1ずつ増加します.

4.2.4 CGI,フォーム機能の利用例

ここでは,フォーム機能により入力された文字などの情報をWWWサーバのCGIプログラムに送信する例として,ページにアクセスしたユーザが自分の名前や電子メールアドレスをページに登録する,訪問者リストの作成方法を紹介します.訪問者リストを作成する際に必要となるファイルを次に示します.これらはWWWサーバにより実行されるので,public_htmlディレクトリの下に作成し,さらに,用途に応じて各ファイルの保護モードをchmodコマンドを使って変更しなければいけません.

#!/usr/local/bin/perl -T

#以下,「#」以降はコメントなので打ち込まなくてもよい.

print "Content-type: text/html\n\n";

open(LOG, "number.txt");    #number.txtというファイルを開く
chop($number = <LOG>);      #ファイルに書き込まれている数字を読み込み,
#変数numberに代入し,改行コードを除く
close(LOG);                 #ファイルを閉じる
$number++;                  #変数number(この場合,カウント数)に1を加える
print "$number";            #カウント数を出力する
open(LOG, "> number.txt");  #number.txtというファイルを開く
print LOG "$number\n";      #1を加えた後の変数numberの値を書き込む
close(LOG);                 #ファイルを閉じる

CGIプログラム`counter.cgi'のサンプル


1.
4.10の内容でinput.htmlという名前のファイルを作成します.



図 4.10:ページ` input.html'のサンプル
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head><title></title></head>
<body>
<form action="register.cgi">
<p>
NAME:<input type="TEXT" name="user_name"><br>
E-MAIL ADDRESS:<input type="TEXT" size="30" name="email_address"><br>
URL:<input type="TEXT" size="30" name="page_address"><br>
<input type="SUBMIT" value="Registration">
</P>
</form>
</body>
</html>


2.
4.11の内容でregister.cgiという名前のCGIプログラムを作成し,すべてのユーザに対して実行可能となるように保護モードを設定します.
3.
list.htmlという名前のファイルを作成し,すべてのユーザに対して書き込み可能となるように保護モードを設定します(内容は何でも可).


% chmod  755  register.cgi<RET>
% chmod  666  list.html<RET>
% _

以上のファイルを準備したら,ブラウザにページ`input.html'を表示し,入力部分(図4.12)に文字を入力してから[Registration]を押します.入力した文字情報がWWWサーバに送信され,WWWサーバはCGIプログラム`register.cgi'を起動して文字情報を渡します.このCGIプログラムは文字情報をlist.htmlに書き込んだ上で,``Thankyou. Click here!''という文章を含んだページを生成します.このページをWWWサーバがブラウザに対して送信します.

#!/usr/local/bin/perl -T

print "Content-type: text/html\n\n";

$args = $ENV{'QUERY_STRING'};

@terms = split(/&/,$args,3);
foreach(@terms){
    ($tag,$value) = split(/=/,$_,2);
    $value =~ s/%(..)/pack("C",hex($1))/ge;
    if ( $tag eq "user_name" ){
	$value =~ s/\+/ /g;
    }else{
	$value =~ s/\+//g;
    }
    $value =~ s/</&lt;/g;
    $value =~ s/>/&gt;/g;
    $value =~ s/"/&quot;/g;
    $tags{$tag} = $value;
}

$ENV{'PATH'} = '/usr/local/bin';
open(LIST,"| /usr/local/bin/nkf -e >> list.html");

print LIST "<a href=\"$tags{'page_address'}\">$tags{'user_name'}</a>\n";
print LIST "($tags{'email_address'})<p>\n";
close(LIST);

print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML4.0//EN\"\n";
print "\"http://www.w3c.org/TR/REC-html40/strict.dtd\">\n";
print "<html>\n";
print "<head><title>Thank you</title></head>\n";
print "<body style=\"bgcolor: #FFFFFF;\">\n";
print "<p>Thank you.\n";
print "<A href=\"list.html\">Click here!</a>\n";
print "</p>\n";
print "</body>\n";
print "</html>\n";

図 4.11: CGIプログラム`register.cgi'のサンプル

WWWサーバから送られてきたページの中の``Click here!''という文字列には list.htmlへのリンクが設定されているので,これをクリックすると登録した情報が表示されます.

このプログラムでは,同時に複数のユーザが[Registration]を押したときのことを考慮していません.同時に複数のユーザが書き込めるようにするには,さらにプログラムを修正する必要があります.詳しい方法については,市販の参考書などを参照してください.


図 4.12 :ページ`input.html'の表示