CGI-BBS > CGI > Perl > cgiについて


カレッヂ
カレッヂ


質問者 yuki  投稿日 2005/4/20(水) 02:34:03
crypt(暗号化)→入力してきたパスワードと比較したい。

色々な参考書を見ながらやってみているのですがうまくいきません…。
登録フォームの受け取り↓

ログイン名とパスワードを登録↓
ログインはそのまま、パスワードは(crypt($FORM{pass} , $salt))で暗号化し、
ファイルへログイン名とパスワード(暗号化)を保存(login:passwd)

認証フォーム↓

保存して置いた、パスワードと入力してきたパスワードを比較。

if(crypt($FORM{pass}, $pass) eq $pass){
	($x= "正しいです。");
}

$passは保存して置いた、暗号化済みのパスワードです。
参考書にはこんなカンジで書かれているんですが…。
比較してもうまくいきません…。
初歩かもしれませんが力をお貸し下さい。




【習熟度】初めて

回答者 sim  [削除]  投稿日 2005/4/22(金) 10:01:57
foreach(@PASS){
 ($login,$pass) = split(/:/);
  if($login eq $loginid && $pass eq $password){$flag = 1;last;}
}

 ↓

foreach(@PASS){
 ($login,$pass) = split(/:/);

  $pass = chomp($pass);

  if($login eq $loginid && $pass eq crypt($password,$pass)){$flag = 1;last;}
}


こんな感じじゃないでしょうか?
chopとかchompを入れてやれば良い気がします。
質問者 yuki  [削除]  投稿日 2005/4/24(日) 13:32:06
sim様いつも有難うございます。
実行してみたのですが、うまくいきませんでした…。
私の記述のミスがある可能性が高いのですが…、目を通してもらえると大変嬉しいです。
質問者 yuki  [削除]  投稿日 2005/4/24(日) 13:38:21
このようなカンジなのですが…。

入力フォーム→crypt(暗号化)→保存→認証フォーム、入力してきたパスワードを比較。

ログイン名とパスワードを登録後↓
ログインはそのまま、パスワードは(crypt($FORM{pass} , $salt))で暗号化し、
ファイルへログイン名とパスワード(暗号化)を保存(login:passwd)


認証フォーム↓

#! c:/perl/bin/perl

# フォームデータの取得
if($ENV{'REQUEST_METHOD'} eq 'POST') {
	read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else {
	$query = $ENV{'QUERY_STRING'};
}

# フォームデータの復元
foreach $pair (split(/&/, $query)) {		# &を切り離し$pairに代入
	($key, $value) = split(/=/, $pair);	# =を切り離しそれぞれ$key,$valueに代入

# 文字のデコード
	$value =~ tr/+/ /;
	$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;

	$FORM{$key} = $value;		# FORM{$key} = $valueで$keyを値に$valueの呼び出し

}

# 比較するファイルデータを呼び出す

open(OPEN, "<./dat");
@PASS = <OPEN>;
close (OPEN);

# パスワードが正しいか比較。(フォーム入力と保存していた過去のpassと同じか比較。)

foreach (@PASS){
	($login, $pass) = split(/:/, $_);

$pass2 =  chomp($pass);

if($pass2 eq crypt($FROM{pass}, $pass2)){
	($x= "正しいです。");{$flag= 1;last;}
}

if(!$flag){
($x= "不正です。");
}
}

print $x;



# サーバー出力
print <<END;
Content-type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01EN">
<html>
<head><title>比較</title></head>
<body>


比較は結果は$x<br>

</body>
</html>
END
回答者 sim  [削除]  投稿日 2005/4/24(日) 13:43:53
foreach (@PASS){
	($login, $pass) = split(/:/, $_);

$pass2 =  chomp($pass);

if($pass2 eq crypt($FORM{pass}, $pass2)){
        $x= "正しいです。";
        $flag= 1;
        last;
}
}
if(!$flag){
($x= "不正です。");
}

これでどうでしょう?
回答者 sim  [削除]  投稿日 2005/4/24(日) 13:45:10
foreach (@PASS){
	($login, $pass) = split(/:/, $_);

$pass2 =  chomp($pass);

if($pass2 eq crypt($FORM{pass}, $pass2)){
        $x= "正しいです。";
        $flag= 1;
        last;
}
}
if(!$flag){
$x= "不正です。";
}
こうですね。。
質問者 yuki  [削除]  投稿日 2005/4/24(日) 14:12:00
sim様、日頃よりお世話になり、大変有難うございます。

さっそく試してみたのですが…、ダメでした。
if文はif(FORM{pass} eq FORM{pass}){やif($pass eq $pass)などでの結果は"正しいです。"と、うまくいくようなのですがcrypt関数を入れると比較結果が"不正です"と、なってしまいます…。

crypt文に問題があるのでしょうか…。
回答者 sim  [削除]  投稿日 2005/4/24(日) 14:30:56
chompが宜しくないようでした。

foreach (@PASS){
	($login,$pass) = split(/:/,$_);
	$pass =~ s/\n$//g;

	if($login eq $FORM{'login'} && $pass eq crypt($FORM{'pass'}, $pass)){
		$x= "正しいです。";
		$flag= 1;
		last;
	}
}

if(!$flag){
	$x= "不正です。";
}

これにしてみてください。

loginIDも付けないとまずいのではないでしょうか?
質問者 yuki  [削除]  投稿日 2005/4/24(日) 15:20:38
sim様、お世話になっております。

やはりダメのようです…、色々とやってみたのですが、それでも比較結果が不正と出てしまいます…。

参考書にのっていた$pass =~ s/[\r\n]*//;なども試してみたのですがダメでした…。

loginの方の比較はまだ記述に不安があったのでpassのみの比較の方からやってみました…。
回答者 sim  [削除]  投稿日 2005/4/24(日) 16:43:22
1../dat の中身はちゃんと入っているか
2.passはcryptされたものが入っているか
3.$FROM{pass} という部分があるが、実際には$FORM{pass}になっているか

この辺を確認してみてください。
質問者 yuki  [削除]  投稿日 2005/4/24(日) 20:30:05
分かりました、もう一度、細かくチェックしてみたいと思います。sim様、お忙しい中、有難うございました。
質問者 yuki  [削除]  投稿日 2005/4/26(火) 18:26:35
確認を行なったところ…、指摘していた$FROM{pass}の部分の誤字が原因だという事が判明しました…。

訂正したところ問題なく比較結果が"正しいです。"と表示されました。
単純なミスだけに、大変申し訳ないです。
指摘有難うございました。

このページは終了したので返信(回答)は書きこめません
 


Web裏技