実験 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 my $time = localtime; print "Content-type: text/html n n"; < html> < head>< title> program1 < /title >< /head> < body bgcolor="#ffccaa" > < p> jikoku $time < /p> < /body> < /html> END_OF_PAGE -1-
実験 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 入力と組み合わせて実 行されることが多い (1) 次に示す html ファイルに FORM に関する記述 (a) (b) を加えて html ファイルを完成させよ そのファイルを httpd.conf で指定されるドキュメン トルートに置いて Web ブラウザでアクセス出来ることを確認せよ ( a) 呼び出しCGIプログラムを指定する FORM タグ ( METHOD 属性は GET を使用 ) ( b)cgiプログラムに渡すデータを入力する INPUT タグ ( TYPE 属性は 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> < hr> < INPUT TYPE="SUBMIT" VALUE="SEND" > < /form> < /body> < /html> -2-
3 実験結果 実験 1 (1)CGI プログラムを置く場所 呼び出される URL "/var/www/cgi-bin/" "http://localhost/" (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 -rwxr-xr-x 1 root root 234 12 月 7 13:21 program1.cgi -3-
実験 3 (1) 入力した文字が出力されることの確認 // strict 宣言 my $time = localtime; // 変数 $time の宣言 現在の時間を代入 // 出力 1ここから END_OF_PAGE までを出力 < p> jikoku $time $ENV{ QUERY_STRING }</p> // 変数 $time と変数 $ENV{ QUERY_STRING} を出力する // ここでの $ENV{ QUERY_STRING} は? の後に入力された文字列 END_OF_SET // 出力 2 終了 (2) ls コマンドが実行出来ることを確認 // strict 宣言 my $time = localtime; // 変数 $time の宣言 現在の時間を代入 // 出力 1ここから END_OF_PAGE までを出力 < p> jikoku $time < /p > // 文字列 1 変数 $time を表示 < p > // 文字列 2 開始 END_OF_PAGE // 出力 1はここまで system ("ls"." /var/www/"); // system 関数 ls コマンドを実行 // system 関数にはプリント関数が入っているので関数がかぶらないようにプ リント関数を分割した print << END_OF_SET // 出力 2ここから END_OF_SET まで出力 < /p > // 文字列 2 終了 END_OF_SET // 出力 2 終了 -4-
(3) 動作確認 // strict 宣言 my $time = localtime; // 変数 $time の宣言 現在の時間を代入 // 出力 1ここから END_OF_PAGE までを出力 < p> jikoku $time < /p > // 文字列 1 変数 $time を表示 < p > // 文字列 2 開始 END_OF_PAGE // 出力 1はここまで system ("ls $ENV{ QUERY_STRING }"); // system 関数で ls コマンドを実行する // このとき ls 以降の文字を変数 $ENV{ QUERY_STRING} にすることに よって? 以降の入力からディレクトリが指定出来る print << END_OF_SET // 出力 2ここから END_OF_SET まで出力 < /p > // 文字列 2 終了 END_OF_SET // 出力 2 終了 -5-
実験 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" に変化し ていたので それを修正 後動作確認 // strict 宣言 my @ls = split /txt=/,$env{ QUERY_STRING }; // "?" 以降に入力された文字の "txt=" 部分を分割 // 出力 1ここから END_OF_PAGE までを出力 < p > // 文字列 2 開始 END_OF_PAGE // 出力 1はここまで $ls[ 1 ] =~ s/%2f/ //g ; // 文字列の "%F2" 部分を"/" に置き換える system ("ls $ls[ 1 ]"); // 置き換えた文字列で ls のディレクトリ指定 print << END_OF_SET // 出力 2ここから END_OF_SET まで出力 < /p > // 文字列 2 終了 END_OF_SET // 出力 2 終了 -6-
4 考察 1 実験 1(1) で調べた内容について説明せよ 実験結果 1(1) 参照 2 実験 2(1) のプログラムを説明せよ // strict 宣言 my $time = localtime; // 変数 $time の宣言 現在の時間を代入 // ここから END_OF_PAGE までを出力 < p> jikoku $time < /p > // 文字列 1 変数 $time を表示 < p > // 文字列 2 END_OF_PAGE // 出力はここまで 3 実験 3(1 ) (2) (3) で作成したプログラムそれぞれ説明せよ 実験結果 実験 3 参照 4 実験 2では perl 実行オプションに - T を使用したが 実験 3では使用していな い なぜ使用しなかったのか また - T オプションはどのような場合に有用であ るか考えよ - T オプションはセキュリティチェックに使われる - T オプションを付けて問題が発生するプログラム以外は付けるのが原則 それにより 実験 2では使用されている 実験 3では フォームから入力された文字列をコマンドとして実行 という作業を行っている このように CGI からコマンドを実行する作業は - T オプションによってブロックされてしまうために 付けることが出来ない -7-
5 実験 4で作成した html ファイル CGIプログラムを説明せよ 実験結果 実験 4 参照 6 実験 3 4ではGETリクエストを用いたが もう一つのPOSTリクエストがよく使われる 両者の特徴と違いを述べよ GETの特徴 単一の変数に値が代入される 長い書き込みが不可能 POSTの特徴 配列に値が代入される 書き込みした後 URLがだらだらと長く表示されない 書き込みできる文字列の長さの制限がなくなる サーバーによってはPOSTが使えない設定になっている場合がある -8-