トップ > Perl Tips > 簡単なパスワード制限


 ■ 簡単なパスワード制限

スクリプトを使った、パスワード制限の仕方を説明します。
基礎の解説:文字列の暗号化

パスワードを作成、保存するスクリプト、パスワードをチェックするスクリプト、
チェック後に表示するファイルなどを用意します。

<パスワード作成・保存スクリプト>(pwdcrypt.cgiで保存)


#!/usr/bin/perl

# パスワード保存ファイル(拡張子を.cgiなどにしたほうが安全です。)
$file = "pwddata.cgi";

# デコード
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}

# モード切替
if ($FORM{'mode'} eq "crypt") {&crypt;}
else {&form;}

# パスワード入力フォーム
sub form {
&header;
print "<FORM ACTION=\"pwdcrypt.cgi\" METHOD=\"POST\">\n";
print "パスワード(1つしか作成できません)<INPUT TYPE=\"PASSWORD\" NAME=\"password\">\n";
print "<INPUT TYPE=\"HIDDEN\" NAME=\"mode\" VALUE=\"crypt\">\n";
print "<INPUT TYPE=\"SUBMIT\" VALUE=\"パスワード作成\">\n";
print "</FORM>\n";
&footer;
}

# 暗号化、保存
sub crypt {
@salts = ( "A".."Z", "a".."z", "0".."9", ".", "/" );
$salt = $salts[int(rand(64))] . $salts[int(rand(64))];
$crypt = crypt($FORM{'password'}, $salt);

open(OUT,"> $file");
flock(OUT, 2);
print OUT $crypt;
close(OUT);

&header;
print "パスワードを保存しました。\n";
&footer;
}

# HTMLヘッダ
sub header {
print "Content-type: text/html\n\n";
print "<html><head>\n";
print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n";
print "</head><body>\n";
}

# HTMLフッタ
sub footer {
print "</body></html>\n";
}

<パスワード認証スクリプト>(pwdcheck.cgiで保存)
#!/usr/bin/perl

# パスワード保存ファイル(拡張子を.cgiなどにしたほうが安全です。)
$file = "pwddata.cgi";

# 認証後表示するページ("http://"から指定してください。)
$page = "http://easycgi.xrea.jp/perltips/script/ok.html";

# デコード
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}

# モード切替
if ($FORM{'mode'} eq "check") {&check;}
else {&form;}

# パスワード入力フォーム
sub form {
&header;
print "<FORM ACTION=\"pwdcheck.cgi\" METHOD=\"POST\">\n";
print "パスワード<INPUT TYPE=\"PASSWORD\" NAME=\"password\">\n";
print "<INPUT TYPE=\"HIDDEN\" NAME=\"mode\" VALUE=\"check\">\n";
print "<INPUT TYPE=\"SUBMIT\" VALUE=\"認証\">\n";
print "</FORM>\n";
&footer;
}

# パスワードファイル読み込み、認証
sub check {
open(IN,"$file");
flock(IN, 1);
$pwd = <IN>;
close(IN);

if (crypt($FORM{'password'},$pwd) eq $pwd) {
print "Location: $page\n\n";
}
else {
&header;
print "パスワードが違います。\n";
&footer;
}
}

# HTMLヘッダ
sub header {
print "Content-type: text/html\n\n";
print "<html><head>\n";
print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n";
print "</head><body>\n";
}

# HTMLフッタ
sub footer {
print "</body></html>\n";
}

このほかに、パスワード保存ファイル(pwddata.cgiで保存)と、
認証後表示するファイル(ここではok.html)をご用意ください。


<解説>

<パスワード作成・保存スクリプト>
・「パスワード保存ファイル」のところは、特に変更する必要はありませんが、
ファイル名を変更した場合は必ず変更してください。

・if ($FORM{'mode'} eq "crypt")
(以下略)
モード切替を行います。
$FORM{'mode'}がcryptならば暗号化、保存処理へ、
何も入っていなければパスワード入力フォームへ飛びます。

・@salts = ( "A".."Z", "a".."z", "0".."9", ".", "/" );
(以下略)
暗号化処理です。
A~Z、a~z(大文字、小文字は区別されます)、0~9、"."、"/"
の64文字の中から2文字を無作為に選び、種にします。

・open(OUT,"> $file");
(以下略)
ここで、パスワードファイルに保存します。


<パスワード認証スクリプト>
・「パスワード保存ファイル」は前述のとおりです。

・「認証後表示するページ」は、"http://"などから指定するようにしてください。

・if ($FORM{'mode'} eq "check")
(以下略)
モード切替を行います。
$FORM{'mode'}がcheckならば認証処理へ、
何も入っていなければパスワード入力フォームへ飛びます。

・open(IN,"$file");
(以下略)
ここで、パスワードファイルを読み込みます。

・if (crypt($FORM{'password'},$pwd) eq $pwd) {
(以下略)
ここで、パスワード認証をして、パスワードが正しければ、
Locationヘッダを使ってページ移動を行います。
Locationヘッダについては、Location ヘッダをご覧ください。
パスワードが間違っていれば、エラーメッセージを出します。


パスワード認証(pwdcheck.cgi)のサンプルはこちらです。
サンプルのパスワードは「password」です。




トラックバック

このエントリーのトラックバックURL:
http://easycgi.xrea.jp/mt-tb.cgi/52