※ここの解説は、後になるほど省略されている場合がありますのでできるだけ順番に読んでください。
■ 12.セキュリティと強制終了
どうでしたか?前回は、プログラミングにどっぷり使っていただきましたがわかりましたか?
パッと見にはかなり複雑なCGIも基本の積み重ねでできているのです。
少しずつ改造していくと、気が付いたときにはかなりの処理を記述していたりします。
いっぺんに全てを理解しようとせず、少しずつ部分的に理解していけば、それほど難しい処理はないのですよ。
前回作成したCGI、ホームページにアップするのはいいですが、まだ、リンクを張ったりして訪れる人が使用できるようにはしないで下さいね。
(「え〜っ」という声が聞こえてきそうですが..)
というのも、実は前回のCGIは便利すぎてまずいのです。
もし、あなたが掲示板も開設していて、そこにパスワードなどを記述していたら、このCGIを使用して覗けてしまうのです。
そこで、今回は、前回のCGIにセキュリティの意味で必要なファイル以外は覗けないように加工します。
今まで、勉強してきたあなたならもうできますよね。
でも、一応、サンプルを記述しておきます。
■ セキュリティ対策
前回のサンプルを「testhtm.dat」以外を表示しようとした場合、強制終了するように変更します。
- 【記述サンプル】
- #!/usr/bin/perl $param = @ARGV[0]; if ($param ne "testhtm.dat") { exit(0); } if ( (substr($param,-4) eq ".htm") or (substr($param,-5) eq ".html") ) { print "Content-type:text/html\n\n"; } else { print "Content-type:text/plain\n\n"; } open(FILE, "<$param"); while(<FILE>){ print; if ( not( (substr($param,-4) eq ".htm") or (substr($param,-5) eq ".html") ) ) { print "<BR>"; } } close(FILE);
上記のサンプルは、5行目〜7行目までを追加しました。
「if ($param ne "testhtm.dat") { } 」 は、
パラメータが"testhtm.dat"と等しくなかった場合の条件式です。
■ 強制終了
CGIを任意のところで強制終了させたい時は、「exit(0);」 と記述します。
上記サンプルの6行目がそうです。
でもこれじゃあまりにも素っ気ないし、エラーで止まっているのかどうかがわからないですね。
そこで、以前習ったヒアドキュメントを使用してメッセージを表示するようにしましょう。
- 【記述サンプル】
- #!/usr/bin/perl $param = @ARGV[0]; if ($param ne "testhtm.dat") { print << "END_OF_DOC"; Content-type:text/html\n\n <HTML> <HEAD> <title>ファイル表\示の中止</title> </HEAD> <BODY TEXT="purple" BGCOLOR="#99ff99"> <B>ごめんなさい、testhtm.dat以外は表\示できないの。</B> </BODY> </HTML> END_OF_DOC exit(0); } if ( (substr($param,-4) eq ".htm") or (substr($param,-5) eq ".html") ) { print "Content-type:text/html\n\n"; } else { print "Content-type:text/plain\n\n"; } open(FILE, "<$param"); while(<FILE>){ print; if ( not( (substr($param,-4) eq ".htm") or (substr($param,-5) eq ".html") ) ) { print "<BR>"; } } close(FILE);
このサンプルは、ひとつ前のサンプルの 「exit(0);」 の前に表示ができないメッセージを表示するHTMLをヒアドキュメント形式で追加しました。
これで、ホームページに設置されても大丈夫です。