実験5
CGIプログラミング
1 目的 動的にWebページを作成する手法の一つであるCGIについてプログラミングを 通じて基本的な仕組みを学ぶ。 2 実験 実験1 Webサーバの設定確認と起動(1)/etc/httpd/confにあるhttpd.confファイルのcgi-binに関する次の項目を調べ
。 、 ( ) 、
よ このとき CGIプログラムを置く場所 CGI実行ディレクトリ と そこに置いたCGIプログラムが呼び出されるURLを確認せよ。
(2)prompt_% sudo /sbin/service httpd start を実行してWebサーバを起動せ
よ(sudo コマンドでパスワードが要求されるので、ログインに用いたパスワ ードを入力すること 。) 実験2 CGIプログラムの実行 (1)次に示す Perl プログラムを入力し、コマンドラインで実行して動作を確 認せよ。このときUNIX上のファイルパーミッションに注意すること。 (2)このプログラムを CGI 実行ディレクトリにコピーし、Web ブラウザで実 行できることを確認せよ。必要であればsudoコマンドを使用すること。 program1.cgi #!/usr/bin/perl -wT use strict; my $time = localtime;
print "Content-type: text/html¥n¥n"; print<<END_OF_PAGE;
<html>
<head title program1 /title /head>< > < >< > <body bgcolor="#ffccaa">
< >p jikoku $time /p< > </body>
</html>
実験3 GETリクエストで使ったCGIプログラム
1 Web URL $ENV
( ) ブラウザで の後ろに ? に続けて文字列を入力すると 変数” ” 、 {QUERY_STRING}として CGI プログラムに渡される。このことを CGI プロ グラムを作成して確認せよ。
( )2 Perlのsystem関数を使ってUNIXのlsコマンドを実行するPerlプログラム を作成せよ。このとき1行目の Perl起動オプションで Tオプションを使わな いことに注意すること。 (3 (1) )、(2)を作興にして、任意のディレクトリを対象に ls コマンドを実 行出来るようにせよ。 実験4 FORMとCGIの連携 CGIプログラムは通常それ単体ではなく html の FORM 入力と組み合わせて実 行されることが多い。 html FORM html (1)次に示す ファイルに に関する記述(a)、(b)を加えて ファイルを完成させよ。そのファイルを httpd.conf で指定されるドキュメン トルートに置いて、Webブラウザでアクセス出来ることを確認せよ。 FORM METHOD ・ a)呼び出しCGIプログラムを指定する( タグ( 属性はGETを使用) INPUT TYPE ・ b)CGIプログラムに渡すデータを入力する( タグ( 属性はTEXTを使用) (2)(1 の) htmlをsubmitしたときに呼び出されるCGIプログラムを作成し、 実験3と同様に入力されたディレクトリに対して ls コマンドを実行した結果 を表示するプログラムを作成せよ。 form1.html <html>
<head title form and cgi /title /head>< > < >< > <body bgcolor="#aaccff">
<form action="cgi-bin/program1.cgi" method="get"> <INPUT type="text" name="txt">
< >p < >/p
3 実験結果 実験1 "/var/www/cgi-bin/" (1)CGIプログラムを置く場所 "http://localhost/" 呼び出されるURL (2)実行
jikken@jikken204 ~ $ sudo /sbin/service httpd start
[ ] Password: を起動中 [ ] httpd : OK 実験2 (1)実行
jikken@jikken204 ~ $ perl -wT program1.cgi
[ ]
Content-type: text/html <html>
<head title program1 /title /head>< > < >< > <body bgcolor="#ffccaa">
< >p jikoku Thu Dec 7 13:18:10 2006 /p< > </body>
</html>
2 + Done emacs program1.cgi [ ]
(2)読み込まれなかったので"chmod"を実行、後確認。 jikken@jikken204 cgi-bin $ chmod +x program1.cgi
[ ]
許可されていない操作です chmod: changing permissions of `program1.cgi':
jikken@jikken204 cgi-bin $ sudo chmod +x program1.cgi
[ ]
Password:
jikken@jikken204 cgi-bin $ sudo ls -l
[ ]
8 合計
実験3
(1)入力した文字が出力されることの確認。 コンパイル形式 #!/usr/bin/perl -w //
宣言 use strict; // strict
変数 の宣言。現在の時間を代入。
my $time = localtime; // $time
出力 print "Content-type: text/html¥n¥n"; // print<<END_OF_PAGE;
出力①ここから までを出力
// END_OF_PAGE
<html> // HTLM形式開始
head title program1 /title /head // program1 < >< > < >< > タイトル:
<body bgcolor="#ffccaa"> //背景の色指定 < >p jikoku $time $ENV QUERY_STRING /p{ }< >
変数 と変数 { }を出力する。
// $time $ENV QUERY_STRING
ここでの { }は”?”の後に入力された文字列 // $ENV QUERY_STRING </body> // HTMLBODY終了 </html> // HTML終了 出力②終了 END_OF_SET // (2) コマンドが実行出来ることを確認。ls コンパイル形式 #!/usr/bin/perl -w // 宣言 use strict; // strict
変数 の宣言。現在の時間を代入。
my $time = localtime; // $time
出力 print "Content-type: text/html¥n¥n"; // print<<END_OF_PAGE;
出力①ここから までを出力
// END_OF_PAGE
<html> // HTLM形式開始
head title program1 /title /head // program1 < >< > < >< > タイトル:
<body bgcolor="#ffccaa"> //背景の色指定
< >p jikoku $time /p< > //文字列①変数$timeを表示
< >p //文字列②開始
出力①はここまで END_OF_PAGE //
( ) 関数 コマンドを実行
system "ls"." /var/www/" ; // system ls
関数にはプリント関数が入っているので関数がかぶらないようにプ // system
(3)動作確認。
コンパイル形式 #!/usr/bin/perl -w //
宣言 use strict; // strict
変数 の宣言。現在の時間を代入。
my $time = localtime; // $time
出力 print "Content-type: text/html¥n¥n"; // print<<END_OF_PAGE;
出力①ここから までを出力
// END_OF_PAGE
<html> // HTLM形式開始
head title program1 /title /head // program1 < >< > < >< > タイトル:
<body bgcolor="#ffccaa"> //背景の色指定
< >p jikoku $time /p< > //文字列①変数$timeを表示
< >p //文字列②開始
出力①はここまで END_OF_PAGE //
system "ls $ENV QUERY_STRING " ;( { } )
関数で コマンドを実行する。 // system ls このとき、 以降の文字を変数 { }にすることに // ls $ENV QUERY_STRING よって ”?”以降の入力からディレクトリが指定出来る。、 << 出力②ここから まで出力
print END_OF_SET // END_OF_SET
< >/p //文字列②終了
</body> // HTMLBODY終了 </html> // HTML終了
出力②終了 END_OF_SET //
実験4
(1)Webブラウザで動作確認。 <html> // html開始
<head title form and cgi /title /head>< > < >< > //タイトルの設定 <body bgcolor="#aaccff"> //背景の設定
<form action="cgi-bin/program1.cgi" method="get"> //送信先をCGIに設定 <INPUT type="text" name="txt"> // テキストボックスの作成
< >p moji /p< > //文 < >hr
<INPUT TYPE="SUBMIT" VALUE="SEND">
テキストボックスの文字を へ送信 // CGI </form> </body> </html> (2)テキストよ読み込ませたところ、"txt="から始まり、"/" "%F2"が に変化し ていたので、それを修正、後動作確認。 コンパイル形式 #!/usr/bin/perl -w // 宣言 use strict; // strict
my @ls = split /txt=/,$ENV QUERY_STRING ;{ }
以降に入力された文字の 部分を分割
// "?" "txt="
出力 print "Content-type: text/html¥n¥n"; // print<<END_OF_PAGE;
出力①ここから までを出力
// END_OF_PAGE
<html> // HTLM形式開始
head title program1 /title /head // program1 < >< > < >< > タイトル: <body bgcolor="#ffccaa"> //背景の色指定 < >p //文字列②開始 出力①はここまで END_OF_PAGE // [ ] 文字列の 部分を に置き換える $ls 1 =~ s/%2F/¥//g ; // "%F2" "/" ( [ ] ) 置き換えた文字列で のディレクトリ指定 system "ls $ls 1 " ; // ls << 出力②ここから まで出力
print END_OF_SET // END_OF_SET
4 考察 1 実験1(1)で調べた内容について説明せよ。 実験結果1(1)参照。 2 実験2(1)のプログラムを説明せよ。 コンパイル形式 #!/usr/bin/perl -w // 宣言 use strict; // strict
変数 の宣言。現在の時間を代入。
my $time = localtime; // $time 出力 print "Content-type: text/html¥n¥n"; // print<<END_OF_PAGE;
ここから までを出力
// END_OF_PAGE <html> // HTLM形式開始
head title program1 /title /head // program1 < >< > < >< > タイトル:
<body bgcolor="#ffccaa"> //背景の色指定
< >p jikoku $time /p< > //文字列①変数$timeを表示
< >p //文字列② </body> // HTMLBODY終了 </html> // HTML終了 出力はここまで END_OF_PAGE // 3 実験3(1)、(2)、(3 、で作成したプログラムそれぞれ説明せよ。) 実験結果 実験3参照。 4 実験2ではperl実行オプションに -T を使用したが、実験3では使用していな い。なぜ使用しなかったのか。また -T オプションはどのような場合に有用であ るか考えよ。 - T オプションはセキュリティチェックに使われる。- T オプションを付け て問題が発生するプログラム以外は付けるのが原則。それにより、実験2では使 用されている。実験3では『フォームから入力された文字列をコマンドとして実 行』という作業を行っている。このように CGI からコマンドを実行する作業は 、 。 -Tオプションによってブロックされてしまうために 付けることが出来ない
5 実験4で作成したhtmlファイル、CGIプログラムを説明せよ。 実験結果 実験4参照。 6 実験3、4ではGETリクエストを用いたが、もう一つのPOSTリクエストが よく使われる。両者の特徴と違いを述べよ。 GETの特徴 ・単一の変数に値が代入される ・長い書き込みが不可能。 POSTの特徴 ・配列に値が代入される ・書き込みした後URLがだらだらと長く表示されない。 ・書き込みできる文字列の長さの制限がなくなる。 ・サーバーによってはPOSTが使えない設定になっている場合がある。