電子書籍の厳選無料作品が豊富!

CGIにてログイン認証の処理を使用してみたく勉強がてら
Perlにて作成しているのですが、どうもうまくいかない
ので質問させてもらいます。

ID・パスワード保存用ファイルfile.datにあらかじめ
100<>p34z7
500<>332bdz
といった感じで入力してまして、

ログインボタンを押したときに
&login_chk($post{'id'},$post{'pwd'});
(URIデコード処理して$post{'id'},$post{'pwd'}を取得します)
を実行して下記サブルーチンを呼び出します。

sub login_chk {
my ($in_id, $in_pass) = @_;
my ($id, $pass);
my $data;
if (!open (IN, "./file.dat")) {
&Error("ファイルが開けません");
}

while ($data = <IN>) {
($id, $pass) = split(/<>/, $data);
if ($in_id eq $id){ last; }
}
close(IN);

unless ($in_pass eq $pass) {
&Error("正しいID・パスワードを入力してください");
}

}

※現状ファイルロックの処理はしてません。
 パスワードの暗号化もしてません。

で、IDに100、パスワードにp34z7と入力してログインしようとするのですが
「正しいID・パスワードを入力してください」とエラーが出てきます。
当然500のときも同じくエラーでした。

どこが問題なのでしょうか?昨日から考えてずっとわからないのでご回答よろしくお願いします。

A 回答 (5件)

#1です。


補足ありがとうございました。

>"$in_pass,$pass正しいID・パスワードを入力してください"とかいった感じでエラーが出たときの値を見てみたのですが同じ文字(500の場合p34z7)が表示されてます。

$in_passと$passが知りたいのではなく$post{'id'}と$post{'pwd'}の値がきちんと入ってきているのか知りたいです。

ちょっと試してみましたが、
---
while ($data = <IN>) {
($id, $pass) = split(/<>/, $data);
---
上記の部分の間に以下を入れてください。

chomp ( $data ) ;

$passの後ろに"\n"が含まれてませんか?
なのでunless判定でNGになってます。

この回答への補足

回答ありがとうございます。
補足かお礼かどちらに出したらよかったかわからなかったのですが、取りあえず補足で投稿します。

指示通り間に
chomp ($data);
を入れたのですが駄目でした。
やっぱり$post{'id'}と$post{'pwd'}の値がちゃんと取得
できてないのでしょうか?
下記のコードで取得してるんですが。。。

if ($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
my @pairs = split(/&/, $query);
foreach my $pair (@pairs) {
my ($key, $value) = split(/=/, $pair);
$key = &UrlDecode($key);
$value = &UrlDecode($value);
&jcode'convert(*value, 'sjis');
$post{$key} = $value;
}
}

sub UrlDecode {
my ($string) = @_;
# 16進数から変換
$string =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
$string =~ s/\+/ /g;
return $string;
}

すいません。問題ありますか?

補足日時:2006/04/20 16:38
    • good
    • 0
この回答へのお礼

本当にすいません。
もう一度見直してみたら
chomp ( $data ) ;
を入れる場所を間違えてました。情けない。
指示通りの場所に入れてみたら問題なく認証できました。

感謝します。

お礼日時:2006/04/20 20:23

あーーー、やってしまた。



インデントが無いので、サブルーチンが途中で終わっているように見えました・・・ orz

先ほどの回答は忘れてください・・・・・・・・・
    • good
    • 0

my ($in_id, $in_pass) = @_;



ここの $in_pass ですが my でレキシカル変数として宣言されてますので、
サブルーチン login_chk 内でのみ有効のはずです。

なので、unless のところで $in_pass が無効になってるんじゃないでしょうか。
先ほどの宣言を login_chk の外に出してみたらどうなりますか?


my ($in_id, $in_pass) = ();

sub login_chk {
($in_id, $in_pass) = @_;
my ($id, $pass);
my $data;
if (!open (IN, "./file.dat")) {
&Error("ファイルが開けません");
}
    • good
    • 0

#1,2です。




unless ($in_pass eq $pass) {
&Error("正しいID・パスワードを入力してください");
}

上記のロジックを
unless ($in_pass eq $pass) {
&Error("$post{'id'}と$post{'pwd'}正しいID・パスワードを入力してください");
}

として確認してください。
$post{'id'}と$post{'pwd'}にはそれぞれなんと入っていますか?

これで$post{'id'}と$post{'pwd'}に正しい情報が入っていない場合は、質問者様が書かれているurlDecode処理に間違いがあるはずです。
    • good
    • 0
この回答へのお礼

何度もすいません。
&Error("$post{'id'}と$post{'pwd'}正しいID・パスワードを入力してください");
この通り変更して確認したのですが、正しく表示されますねぇ。
100の場合はp34z7で500の場合は332bdzです。
現在ローカルの環境(WinXP PRo+Apache1.3+ActivePerl5.8)でのテストですが別に関係ないですよね?
取りあえずもう一度一からやり直してみます。
いろいろありがとうございました。

お礼日時:2006/04/20 18:28

初めまして!補足要求です。



以下の処理で
&login_chk($post{'id'},$post{'pwd'});

$post{'id'}と$post{'pwd'}にはきちんと正しいIDとパスワードは入っていることを確認されましたか?

この回答への補足

早速の回答どうもです。
確認としては
&login_chk($post{'id'},$post{'pwd'});
の前にそれぞれ入力されているかのチェックと、
あとちゃんと取得できているのかどうかと思い

unless ($in_pass eq $pass) {
&Error("正しいID・パスワードを入力してください");
}
の"正しいID・パスワードを入力してください"の部分に
"$in_pass,$pass正しいID・パスワードを入力してください"とかいった感じでエラーが出たときの値を見てみた
のですが同じ文字(500の場合p34z7)が表示されてます。
こんな確認方法では駄目なのでしょうか?

補足日時:2006/04/20 14:42
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!