No.14147 投稿時間:2004年01月08日(Thu) 09:29 投稿者名:海 URL:
user2.datの中身
user1:pass1
りゅう:りゅうパス
CGIプログラム
#! c:/perl/bin/perl
#============#
# 基本設定 #
#============#
# ユーザーファイル
$userfile = './user2.dat';
# 文字コード
$charset = 'Shift_JIS';
#============#
# 設定完了 #
#============#
*FORM = GetPara();
&loadUserfile;
if(not exists $FORM{'adminpass'}) {
&printGatePage;
}
elsif($FORM{'name'} eq "") {
&printErrorPage("名前を入力してください。");
}
elsif($FORM{'name'}) {
for($i=1;$i<=$count;$i++) {
if($USER{$i} ne $FORM{'name'}) {
&printErrorPage("名前が違います。");
}
elsif($USER{$i} eq $FORM{'name'}) {
if($FORM{'adminpass'} eq $USER{$FORM{'name'}}) {
&printAdminPage;
} else {
&printErrorPage("パスワードが違います。");
}
}
}
}
exit;
#======================#
# フォームデータ取得 #
#======================#
sub GetPara {
my($encode) = @_;
my($method) = $ENV{'REQUEST_METHOD'};
local($qu, @in, $key, $val);
# 日本語コード変換
require 'jcode.pl' if $encode;
# パラメータ取得
if($method eq 'GET') {
$qu = $ENV{'QUERY_STRING'};
}
elsif($method eq 'POST') {
read(STDIN, $qu, $ENV{'CONTENT_LENGTH'});
}
local(@qu) = split(/&/, $qu);
foreach(@qu) {
tr/+/ /;
($key, $val) = split(/=/);
$key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c', hex($1))/ge;
$val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c', hex($1))/ge;
$val =~ s/\r\n/\n/g;
jcode'convert(*key, $encode) if ($encode);
jcode'convert(*val, $encode) if ($encode);
$in{$key} = $val;
}
# 戻り値
return *in;
}
#======================#
# パスワード入力画面 #
#======================#
sub printGatePage {
print "Content-type: text/html; charset=$charset\n\n";
print <<"EOM";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<body>
<head>
<title>パスワード入力画面</title>
</head>
<h1>ユーザー管理</h1>
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
名前:<input type="text" name="name"><br>
パスワード:<input type="password" name="adminpass"><br>
<input type="submit" value="決定">
</form>
</body>
</html>
EOM
}
#========================#
# ユーザーファイル読込 #
#========================#
sub loadUserfile {
my ($ln, $name, $pass);
open(FILE, "<$userfile") or &printErrorPage("ユーザーファイルが開けません。");
$count = 0;
while($ln = <FILE>) {
$count++;
chomp $ln;
($name, $pass) = split(/:/, $ln);
$USER{$name} = $pass;
$USER{$count} = $name;
}
close FILE;
return($count);
}
#====================#
# エラーページ出力 #
#====================#
sub printErrorPage {
print "Content-type: text/html; charset=$charset\n\n";
print <<"EOM";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<body>
<head>
<title>エラーページ</title>
</head>
<h1>エラー</h1>
<br>$_[0]
</body>
</html>
EOM
exit;
}
#==================#
# 入出後のページ #
#==================#
sub printAdminPage {
my $name;
print "Content-type: text/html; charset=$charset\n\n";
print <<"EOM";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<body>
<head>
<title>入出後</title>
</head>
<h1>入出後のページ</h1><br>$FORM{'name'}さん<br>
</body>
</html>
EOM
exit;
}
__END__
user2.datの中の1行目しか認証されません。
なぜでしょうねぇ?
順に見ていっても、間違っていそうな箇所は見当たりませんが。。。
No.14155 投稿時間:2004年01月09日(Fri) 00:53 投稿者名:帯鯖 URL:
帯鯖@名古屋です。 ヒント。 ファイル全体を格納した変数に split したら、どうなります? また、蛇足ですが、その変数から改行を取り除いて何を期待しますか? あとはご自身次第。 > user2.datの中身 > user1:pass1 > りゅう:りゅうパス > > > CGIプログラム > #! c:/perl/bin/perl > > #============# > # 基本設定 # > #============# > > # ユーザーファイル > $userfile = './user2.dat'; > > # 文字コード > $charset = 'Shift_JIS'; > > #============# > # 設定完了 # > #============# > > *FORM = GetPara(); > &loadUserfile; > > if(not exists $FORM{'adminpass'}) { > &printGatePage; > } > elsif($FORM{'name'} eq "") { > &printErrorPage("名前を入力してください。"); > } > elsif($FORM{'name'}) { > for($i=1;$i<=$count;$i++) { > if($USER{$i} ne $FORM{'name'}) { > &printErrorPage("名前が違います。"); > } > elsif($USER{$i} eq $FORM{'name'}) { > if($FORM{'adminpass'} eq $USER{$FORM{'name'}}) { > &printAdminPage; > } else { > &printErrorPage("パスワードが違います。"); > } > } > } > > } > > exit; > > #======================# > # フォームデータ取得 # > #======================# > sub GetPara { > my($encode) = @_; > my($method) = $ENV{'REQUEST_METHOD'}; > local($qu, @in, $key, $val); > > # 日本語コード変換 > require 'jcode.pl' if $encode; > > # パラメータ取得 > if($method eq 'GET') { > $qu = $ENV{'QUERY_STRING'}; > } > elsif($method eq 'POST') { > read(STDIN, $qu, $ENV{'CONTENT_LENGTH'}); > } > local(@qu) = split(/&/, $qu); > foreach(@qu) { > tr/+/ /; > ($key, $val) = split(/=/); > $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c', hex($1))/ge; > $val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c', hex($1))/ge; > $val =~ s/\r\n/\n/g; > jcode'convert(*key, $encode) if ($encode); > jcode'convert(*val, $encode) if ($encode); > $in{$key} = $val; > } > > # 戻り値 > return *in; > } > > #======================# > # パスワード入力画面 # > #======================# > sub printGatePage { > > print "Content-type: text/html; charset=$charset\n\n"; > > print <<"EOM"; > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> > <html> > <body> > <head> > <title>パスワード入力画面</title> > </head> > <h1>ユーザー管理</h1> > <form action="$ENV{'SCRIPT_NAME'}" method="POST"> > 名前:<input type="text" name="name"><br> > パスワード:<input type="password" name="adminpass"><br> > <input type="submit" value="決定"> > </form> > </body> > </html> > EOM > } > > #========================# > # ユーザーファイル読込 # > #========================# > sub loadUserfile { > > my ($ln, $name, $pass); > > open(FILE, "<$userfile") or &printErrorPage("ユーザーファイルが開けません。"); > > $count = 0; > while($ln = <FILE>) { > $count++; > chomp $ln; > ($name, $pass) = split(/:/, $ln); > $USER{$name} = $pass; > $USER{$count} = $name; > } > > close FILE; > > return($count); > } > > #====================# > # エラーページ出力 # > #====================# > sub printErrorPage { > print "Content-type: text/html; charset=$charset\n\n"; > print <<"EOM"; > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> > <html> > <body> > <head> > <title>エラーページ</title> > </head> > <h1>エラー</h1> > <br>$_[0] > </body> > </html> > EOM > exit; > } > > #==================# > # 入出後のページ # > #==================# > sub printAdminPage { > > my $name; > > print "Content-type: text/html; charset=$charset\n\n"; > print <<"EOM"; > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> > <html> > <body> > <head> > <title>入出後</title> > </head> > <h1>入出後のページ</h1><br>$FORM{'name'}さん<br> > </body> > </html> > EOM > exit; > } > > __END__ > > > > user2.datの中の1行目しか認証されません。 > なぜでしょうねぇ? > 順に見ていっても、間違っていそうな箇所は見当たりませんが。。。
No.14163 投稿時間:2004年01月09日(Fri) 16:52 投稿者名:海 URL:
> ファイル全体を格納した変数に split したら、どうなります?
本(初心者用)にはファイルの内容を1行ずつ読み込むとあったので、:で分かれると思ってましたが。。。
> また、蛇足ですが、その変数から改行を取り除いて何を期待しますか?
本に書いてるあるものを、そのまま書いただけなので、たいした理由はわかりません^^;
(本にある例題をしながら、少しずつ改造していってます。)
No.14156 投稿時間:2004年01月09日(Fri) 00:57 投稿者名:水芹 URL:
こんばんは。
>for($i=1;$i<=$count;$i++) {
>if($USER{$i} ne $FORM{'name'}) {
>&printErrorPage("名前が違います。");
>}
この部分、必ず最初に$USER{1}と入力されたnameを比較して、違ったらエラーにしてますよね。
なのでuser2.datの1行目以外はエラーになります。
No.14157 投稿時間:2004年01月09日(Fri) 01:16 投稿者名:水芹 URL:
私がやるなら、せっかくハッシュを使っているので、
elsif($FORM{'name'}) {
for($i=1;$i<=$count;$i++) {
if($USER{$i} ne $FORM{'name'}) {
&printErrorPage("名前が違います。");
}
elsif($USER{$i} eq $FORM{'name'}) {
if($FORM{'adminpass'} eq $USER{$FORM{'name'}}) {
&printAdminPage;
} else {
&printErrorPage("パスワードが違います。");
}
}
}
}
この部分を
elsif($FORM{'name'}) {
if(!$USER{$FORM{'name'}}) {
&printErrorPage("名前が違います。");
} else {
if($FORM{'adminpass'} eq $USER{$FORM{'name'}}) {
&printAdminPage;
} else {
&printErrorPage("パスワードが違います。");
}
}
}
こんな感じにするかなぁ・・・。
No.14162 投稿時間:2004年01月09日(Fri) 16:49 投稿者名:海 URL:
> 私がやるなら、せっかくハッシュを使っているので、
> こんな感じにするかなぁ・・・。
書き換えたところ、ちゃんと動きました。
初心者用の本みながら、ちょっとずつ改造していって、いろんなことに挑戦していますが、
if(!$USER) とか本にはなかったので、ネットでいろいろ調べなきゃいけませんね。
よ~~~~~く考えると、指摘があったように3回も繰り返さないうちに1回目で終わっちゃうのかぁ。