投稿日:2004年01月08日 作成鷹の巣

No.14147 CGIのユーザーファイルの1行目しか認証されません。



CGIのユーザーファイルの1行目しか認証されません。

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行目しか認証されません。
> なぜでしょうねぇ?
> 順に見ていっても、間違っていそうな箇所は見当たりませんが。。。


本(初心者用)にはファイルの内容を1行ずつ読み込むとあった。

No.14163 投稿時間:2004年01月09日(Fri) 16:52 投稿者名: URL:

> ファイル全体を格納した変数に split したら、どうなります?
本(初心者用)にはファイルの内容を1行ずつ読み込むとあったので、:で分かれると思ってましたが。。。

> また、蛇足ですが、その変数から改行を取り除いて何を期待しますか?
本に書いてるあるものを、そのまま書いただけなので、たいした理由はわかりません^^;
(本にある例題をしながら、少しずつ改造していってます。)


この部分、必ず最初に$USER{1}と入力されたnameを比較して、違ったらエラーにしてます。

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回目で終わっちゃうのかぁ。


|目次|掲示板|過去ログ目次|▲頁先頭|