perlを使ったCGIによる簡単なパスワード制限の方法です。
通常CGIに使用される言語はperlですので、CGI利用可能なサーバーなら問題無く
動作すると思います。
動作サンプル(新窓で出ます)
以下ソースコードです。
HTMLの部分が少々長く感じますが非常に単純な構造です。
#!/usr/bin/perl
$script='passwd.cgi';
$password='sample';
$comment="";
print "Content-type: text/html\n\n";
&judge;
exit;
sub judge {
if (!$ENV{"CONTENT_LENGTH"}) { &query; }
else {
read(STDIN,$input,$ENV{"CONTENT_LENGTH"});
$input =~ s/^password=//g;
if ($input eq $password) { &correct; }
else {
$comment="パスワードが違います";
&query;
}
}
}
sub query {
print <<HTML;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>パスワード認証が必要です</title>
<style type="text/css"><!--
body { text-align: center; }
form { width: 14em; margin: 20% auto; text-align: left; }
--></style>
</head>
<body onload="document.form.password.focus();">
<form method="post" action="$script" name="form">
<p>Password: <input type="text" name="password" size="12">
<p>
<input type="submit" value="OK">
<input type="reset" value="Clear" onclick="document.form.password.focus();">
<p>$comment
</form>
</body>
</html>
HTML
}
sub correct {
print <<HTML;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="refresh"
content="5; url=../perlpasswd.html">
<title>認証しました</title>
<style type="text/css"><!--
body { text-align: center; margin: 20% auto; }
--></style>
</head>
<body>
<p>正解! 5秒で移動します
<p><a href="../perlpasswd.html">
移動しないときはこちら
</a>
</body>
</html>
HTML
}
#!/usr/bin/perl は、perlスクリプトの実行ファイルである事を意味します。
perlのパスはサーバーによって異なる場合がありますので、適切なパスに変更して
ください。
$script='passwd.cgi';
このCGIスクリプトのファイル名を変数$scriptにセットします。
$scriptはフォームのaction属性で指定します。
$password='
sample';
変数$passwordにパスワードをセットしています。
sampleがパスワードとなりますので変更してください。
$comment="";
print "Content-type: text/html\n\n";
&judge;
exit;
この辺りが一応メインルーチンですが、変数$commentに空の値を入れて初期化、
print "Content-type: text/html\n\n"; でサーバーにtext/htmlとして送信させ、
judgeというサブルーチンに飛んで終了という粗末なものです。
sub judge { } はフォームからのデータを受信し、処理を分岐するサブルーチンです。
フォームからのデータは、name属性の値=入力値 となり、データが複数の場合は&で
区切られます。今回の場合はpasswordのみですので、password=入力値 となります。
受信データが無い場合は最初の呼出と判断して、サブルーチンqueryへ飛んでパスワード
入力のフォームを生成します。
受信データが有る場合は $input =~ s/^password=//g; で、入力値に付加された余分な
部分を正規表現でカットして変数$passwordと照合し、一致する場合はサブルーチン
correctへ飛びます。
また、一致しない場合は変数$commentに"パスワードが違います"をセットして
サブルーチンqueryへ飛び、パスワード入力のフォームを生成します。
sub query { } はパスワード入力フォームを生成するサブルーチンです。
print <<HTML; と HTML に挟まれた部分がHTML文書として出力されます。
<p>Password: <input type="text" name="password" size="12">
パスワード入力を伏せ字にしたいときは、この行の type="text" を type="password"
に変更してください。
このHTML文書中の変数$commentの部分は、パスワードが一致しなかった場合に
サブルーチンjudgeでセットされた"パスワードが違います"が表示されます。
sub correct { } はパスワードが一致した場合に表示されるHTML文書を生成する
サブルーチンです。
<meta http-equiv="refresh"
content="5; url=
../perlpasswd.html">
このmetaタグで5秒後に移動するページを指定しています。
(このサンプルでは、このページに移動します)
<p><a href="
../perlpasswd.html">
移動しないときはこちら
</a>
そして、移動しないブラウザのためにハイパーリンクも用意しておきます。
この例では移動用のページを表示させていますが、勿論 sub correct { } 内の
HTML部分に直接パスワード制限するページ内容を記述しても構いませんし、
フレームにして表示させても良いでしょう。
または、 sub correct { } を次のように変更すると別ファイルからページ内容を
読み込んで表示させることが出来ます。
sub correct {
open(HTML,$page) or die print "Can't open file.";
my $html=join("",<HTML>);
close(HTML);
print $html;
}
変数$pageに読み込んで表示させるためのページ内容を記述したファイル(HTML形式)を
指定しておく必要がありますが、これはスクリプト冒頭の変数$passwordの次辺りに
記入しておくと良いでしょう。
$script='passwd.cgi';
$password='
sample';
$page='
secret_page.html';
secret_page.htmlは適当なファイル名に変更してください。
(CGIスクリプトなどは使用出来ません)