Webページにおかれている掲示板やアンケートなどは, CGI (Common Gateway Interface) の機能を利用して作成できます
CGIとはWebサーバが,Webブラウザからの要求に応じてプログラムを実行するための仕組みを意味します.
通常,Webブラウザからページの送信要求を受けると,Webサーバはファイル をそのまま送信します.しかし,CGIを利用したファイル(拡張子が `.cgi' などのファイル) の送信要求を受けた場合,Webサーバは そのプログラムを実行することで何らかの処理を行い,その結果,生成されるテキストや 画像などをWebブラウザに向けて送信します(図4.12). また,フォーム機能によりユーザから送られてきた情報を処理する場合にもCGIを 利用します.
このWebサーバで実行されるプログラムを``CGIプログラム'' といいます.CGIプログラムを記述する言語(Perl,Cなど) はWebサーバで実行できるものであればどの言語で記述しても かまいません.本書では文字列の処理に優れ, 広く使われているPerlによるCGIプログラムを紹介します.
CGIプログラムは,Webサーバでプログラムとして実行されるので, 適切に利用しないと非常に危険です. 次に,CGIプログラムを書くときの注意点をあげます. CGIプログラムのセキュリティについては,`The World Wide Web Security FAQ' ( http://www.w3.org/Security/)などを参照してください.
% pwd <ENTER> /home/t00000tf/public_html % chmod 755 sample.cgi <ENTER> % ls -l sample.cgi <ENTER> -rwxr-xr-x 1 t00000tf 4103 Jun 30 07:11 sample.cgi % _
フォーム機能を利用すると,ユーザが入力した文字などの情報をWebサーバにある CGIプログラムに送信できます.これにより,CGIプログラムはユーザからの情報 に応じたインタラクティブな処理ができます.
この機能を利用したページを作成 するには, CGIプログラムに送信する内容を<form>タグで囲った中に, <input>タグなどで送信する内容を指定するフィールドを設定します.
<form>タグから</form>タグまでに次のページに送信したい範囲を指定します.
<input>タグにより,送信する情報を入力するフィールドを作成し ます. <input>タグは,<form>タグと</form>タグに 囲まれた領域に記述してください.また,type属性によって, 他に指定できる属性が異なってきます.
ここでは,SSIによりCGIプログラムを実行する例として,アクセスカウン タの作成方法を紹介します.アクセスカウンタとは,それが設置されたページ がアクセスされた回数を数える機能です.
アクセスカウンタのプログラムを作成する際に必要となる2つのファイルを 次に示します.これ らはWebサーバによりアクセスされるので, `public_html'ディレクトリ の下に作成し,さらに,ファイルの用途に応じて各ファイルの保護モードを chmodコマンド() を使って変更します.
次に,ファイルの中身`0'のファイルと,各ファイルの保護モードの変更の実行例を示します.
% echo 0 > number.txt <ENTER> % chmod 705 counter.cgi <ENTER> % chmod 606 number.txt <ENTER> % _
以上のファイルを準備したら,`public_html'ディレクトリの下にアクセス カウンタを設置するページを作成し,次の1行を記述します.なお,このアク セスカウンタはSSIを利用しているので,これを埋め込むページのファイル の拡張子は`.shtml'でなければいけません.
アクセスカウンタを設置したぺージをWebブラウザで表示すると, 先の一行を記述した部分に``あなたは1人目です.''と表示 されます.以後,このページがアクセスされるたびにこの数値は1ずつ増加します. しかし,このperlプログラムは簡単な例なので, 同時に多数のアクセスが発生するとカウンタの値が`0'になってしまいます.
ここでは,フォーム機能により入力された文字などの情報をWebサーバのCGI プログラムに送信する例として,ページにアクセスしたユーザが自分の名前 や電子メールアドレスをページに登録する,訪問者リストの作成方法を紹介しま す. 訪問者リストを作成する際に必要となるファイルを次に示します.これらはWWWサー バにより実行されるので,`public_html'ディレクトリの下に作成し, さらに,ファイルの用途に応じて各ファイルの保護モードを chmodコマンド() を利用して変更します.
使用するファイルの一覧と機能を次に示します.
図4.15の内容で `input.html'という名前のファイルを作成する.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
4.01//EN">
<html> <head> <title>Registration</title> </head> <body> <form action="register.cgi" method="post"> <p> 名前:<input type="text" name="register_name"><br> メールアドレス:<input type="text" size="30" name="email_address"><br> ホームページアドレス:<input type="text" size="30" name="url"><br> <input type="submit" value="Registration"> </p> </form> </body> </html> |
図4.16の内容で `register.cgi'という名前のファイルを作成する.
#!/usr/local/bin/perl -T print "Content-type: text/html\n\n"; # 文書の型をブラウザへ送信. use CGI; $q = new CGI; # オブジェクトを宣言 $register_name = $q->param('register_name'); # 変数register_nameにパラメータを代入. $email_address = $q->param('email_address'); # 変数mail_addressにパラメータを代入. $url = $q->param('url'); # 変数urlにパラメータを代入. $register_name = $q->escapeHTML($register_name); # それぞれのフォームで $email_address = $q->escapeHTML($email_address); # HTMLタグが入力された場合,HTML表記へ $url = $q->escapeHTML($url); # 変換する.(ex: `>'を`>'へ) open(LOG, ">>list.txt"); # ファイルを追加書き込みモードで開く. print LOG $register_name."<>".$email_address."<>".$url."\n"; # ファイルに書き込む. close(LOG); # ファイルを閉じる. print <<"EOF" # `EOF'までの内容をそのまま出力. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>Thank You</title> <style type="text/css"> dd { font-weight: bold; } </style> </head> <body bgcolor="#FFFFFF"> <h1>Registered.</h1> <dl> <dt>名前 <dd>$register_name <dt>メールアドレス <dd>$email_address <dt>ホームページアドレス <dd>$url </dl> <a href="list.cgi">LIST page</a> <br> </body> </html> __END__ |
図4.17の内容で `list.cgi'という名前のファイルを作成する.
#!/usr/local/bin/perl -T print "Content-type: text/html\n\n"; # 文書の型をブラウザへ送信. open(LOG, "<list.txt"); # ファイルを読み取りモードで開く. while($linedata = <LOG>); # 一行一行読みとり,# <>で区切られた項目をそれぞれの変数へ代入. ($name_data, $mail_data, $url_data) = split(/<>/, $linedata, 3); $mail_data = "<a href=\"mailto:$mail_data\">$mail_data</a>"; $url_data = "<a href=\"$url_data\+">$url_data</a>"; # tabledata変数へ行のデータを追加する. $tabledata .= "<tr>\n"; $tabledata .= "<td>$name_data</td><td>$mail_data</td><td>$url_data</td>\n"; $tabledata .= "</tr>\n"; close(LOG); print <<"EOF" <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>List</title> </head> <body bgcolor="#FFFFFF"> <table border="1"> <tr> <th>名前</th><th>メールアドレス</th><th>ホームページ</th> </tr> $tabledata </table> </body> </html> __END__ |
`list.html'という名前の空ファイル を作成し,他のユーザに対して書き込み可能と なるように保護モードを設定する.また, 次のように(2)と(3)で作成したファイルが実行可能になるように保護モードを設定する.
% chmod 705 register.cgi <ENTER> % chmod 705 list.cgi <ENTER> % touch list.txt <ENTER> % chmod 606 list.txt <ENTER> % _
ファイルを作成し,保護モードを設定したら, ブラウザにページ`input.html'を表示し, 入力部分(図4.18)に文字を入力してから [Registration]を押します.入力した文字情報がWebサーバに送信され, WebサーバはCGIプログラム`register.cgi'を起動して 文字情報を渡します. このCGIプログラムは文字情報の各項目をlist.txtに書き込んだ上で, 登録した内容を含んだページを生成します. このページをWebサーバがブラウザに対して送信します. 登録一覧ページへは`register.cgi'ページの下の方にある ``LIST page''というテキストリンクをクリックします. `list.cgi'では`list.txt'からデータを読み込み, ブラウザに表示します.