CGI-BBS > CGI > Perl > cgi(crypt)の設置でについて…。


カレッヂ
カレッヂ


質問者 yuki  投稿日 2005/5/1(日) 04:01:32
サーバーソフト(httpd.exe)を立ち上げて、実行すると問題なくcrypt後の値が出るのですが、
レンタルサーバーにアップロードするとcrypt後の値が出なくなってしまいます…。


# フォームデータの送信→データの取得→パスワードの暗号化(ファイルへ保存)→ファイル(暗号化後)呼び出し入力してきた値と比較

# 登録用入力フォーム

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><title>登録</title></head>
<body>
	<hr>
	<h1>認証</h1><hr>
	<form action="./kakikomi.cgi" method="POST">
	ログイン名:<input type="text" name="login"><br>
	パスワード:<input type="text" name="pass"><br>
	<input type="submit" value="登録する">
	<input type="reset" value="訂正">
	</form>
</body>
</html>



==============================


# フォームデータの取得→暗号化→ファイルへ保存

#!/usr/bin/perl
# フォームデータを受け取り→デコード→パスワードの暗号化→ファイルへの書き込み
# フォームデータの取得
if($ENV{'REQUEST_METHOD'} eq 'POST') {
	read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else {
	$query = $ENV{'QUERY_STRING'};
}

# フォームデータの復元

foreach $pair (split(/&/, $query)) {
	($key, $value) = split(/=/, $pair);

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

	$FORM{$key} = $value;


}


$salt = $abc[rand(64)] . $abc[rand(64)];	# 乱数を生成
$passwd = crypt($FORM{pass},$salt);	

open(OUT, ">> ./dat");	# ファイルを開く(./は同じ階層)
print OUT "$FORM{login}:$passwd\r\n";	# ファイルを開きログイン名と暗号化したパスワードを保存

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01EN">
<html>
<head><title>フォームデータ</title></head>
<body>
<h1>登録完了!!</h1>
<h1>フォームデータの結果</h1>

<br>
入力したログイン名は$FORM{login}<br>
入力したパスワードは$FORM{pass}<br>
暗号化後のパスワードは$passwd<br>

</body>
</html>
END

==============================
# 比較用のhtml


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><title>ログイン</title></head>
<body>
	<hr>
	<h1>認証</h1><hr>
	<form action="./hikaku.cgi" method="POST">
	ログイン名:<input type="text" name="login"><br>
	パスワード:<input type="text" name="pass"><br>
	<input type="submit" value="登録する">
	<input type="reset" value="訂正">
	</form>
</body>
</html>
 
==============================

# フォームデータの受け取り→保存データの呼び出し(暗号化passwd)→入力してきたログインとパスワード(再暗号化)比較。

#!/usr/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(/:/, $_);
$pass =~ s/[\r\n]$*//g;

if($login eq $FORM{login} && $pass eq crypt($FORM{pass}, $pass)){
	$x= "正しいです。";
	$flag= 1;
	last;
	}
}
if(!$flag){
$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

============================

$FORM{login},$FORM{pass}は問題無く呼び出せるのですが…、
$salt = $abc[rand(64)] . $abc[rand(64)];
$passwd = crypt($FORM{pass},$salt); 後の$passwdの値が出なくなってしまいます…。

どうか宜しくお願いします。





【習熟度】(未選択)

質問者 yuki  [削除]  投稿日 2005/5/3(火) 08:19:28
色々試してみたところ上手くいきました。
$saltの乱数生成が上手くいっていませんでした…。
$salt = $abc[rand(64)] . $abc[rand(64)];←この部分の配列が上手くいっていない様でした…。
書き換えると上手くいきました、大変ご迷惑をおかけしました。

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


Web裏技