2003 CNS GUIDE
copyright
 

4.3 CGIとフォーム機能

Webページにおかれている掲示板やアンケートなどは,CGI (Common Gateway Interface) の機能を利用して作成できます

4.3.1 CGIの機能

CGIとはWebサーバが,Webブラウザからの要求に応じてプログラムを実行するための仕組みを意味します.

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

CGIの概念
図 4.12 CGIの概念

このWebサーバで実行されるプログラムを``CGIプログラム'' といいます.CGIプログラムを記述する言語(Perl,Cなど) はWebサーバで実行できるものであればどの言語で記述しても かまいません.本書では文字列の処理に優れ,広く使われているPerlによるCGIプログラムを紹介します.

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

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

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

4.3.2 フォーム機能

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

この機能を利用したページを作成 するには,CGIプログラムに送信する内容を<form>タグで囲った中に,<input>タグなどで送信する内容を指定するフィールドを設定します.

4.3.2.1 <form>タグ

<form>タグから</form>タグまでに次のページに送信したい範囲を指定します.

<form action="URL" method="送信する方法">
...
</form>

4.3.2.2 <input>タグ

<input>タグにより,送信する情報を入力するフィールドを作成し ます. <input>タグは,<form>タグと</form>タグに 囲まれた領域に記述してください.また,type属性によって,他に指定できる属性が異なってきます.

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

4.3.3 SSI,CGIの利用例

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

アクセスカウンタのプログラムを作成する際に必要となる2つのファイルを 次に示します.これ らはWebサーバによりアクセスされるので,`public_html'ディレクトリ の下に作成し,さらに,ファイルの用途に応じて各ファイルの保護モードを chmodコマンド([*]) を使って変更します.

  1. 4.14の内容 でcounter.cgiという名前のCGIプログラムを 作成する.



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

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

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

open(LOG, "number.txt");    #number.txtというファイルを開く
 $number = ;                #ファイルに書き込まれている数字を読み込む
close(LOG);                 #ファイルを閉じる

$number++;                  #変数number(この場合,カウント数)に1を加える
print $number;              #カウント数を出力する

open(LOG, "> number.txt");  #number.txtというファイルを開く
 print LOG $number;         #1を加えた後の変数numberの値を書き込む
close(LOG);                 #ファイルを閉じる

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

  1. counter.cgiを他のユーザに対して実行可能となるよ うに保護モードを設定する.
    中身が数字の0だけである `number.txt'という名前のテキストファイルを作成 し,他のユーザに対して書き込み可能となるよ うに保護モードを設定します.
    `number.txt'を作成する際にechoコマンド (引数を出力するコマンド)と ``リダイレクト''を利用することによって,簡単にファイルを作成できます.

    次に,各ファイルの保護モードの変更の実行例を示します.

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

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


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

アクセスカウンタを設置したぺージをWebブラウザで表示すると,先の一行を記述した部分に``あなたは1人目です.''と表示 されます.以後,このページがアクセスされるたびにこの数値は1ずつ増加します. しかし,このperlプログラムは簡単な例なので,同時に多数のアクセスが発生するとカウンタの値が`0'になってしまいます.

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

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

使用するファイルの一覧と機能を次に示します.

  1. 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.15 ページ`input.html'のサンプル

  2. 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.16 CGIプログラム`register.cgi'のサンプル

  3. 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__
    
    
    CGIプログラム`list.cgi'のサンプル

  4. `list.html'という名前の空ファイル を作成し,他のユーザに対して書き込み可能と なるように保護モードを設定する.また,次のように(2)と(3)で作成したファイルが実行可能になるように保護モードを設定する.

% chmod  755  register.cgi <ENTER>
% chmod  755  list.cgi <ENTER>
% touch  list.txt <ENTER>
% chmod  666  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'からデータを読み込み,ブラウザに表示します.

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