各パラメータを"="で関連付けたコンフィグファイルを用意して、その中から“password=xxx”のxxxを拾って、パスワードによるアクセス制限をしたいです。
## コンフィグファイル
user=aaaaa
password=bbbbb
・・・
## ソース
use CGI;
my $cgi = CGI::new();
my $passwd = $cgi->param('passwd');
my $conf = "コンフィグファイル名";
my @readConfData = ();
if(open(FP, "<$conf")) {
flock(FP, 2);
while(my $line = <FP>) {
chop($line);
push(@readConfData, $line);
}
flock(FP, 8);
close(FP);
}
my $confLine = join('&', @readConfData);
my %confData = map { /([^=]+)=(.+)/ } split /&/, $confLine;
my $confPasswd;
$confPasswd = $confData{'password'};
if($confPasswd eq $passwd) {
データ表示~
上のように書いていて、デバッガで試してみて想定どおりの値が入っていても、パスワードを突き合わせるところで弾かれてしまいます。それ以前に、かなり回りくどいやり方になっていて、もっと簡単な方法があるようにも思ってはいるのですが。ヒントを教えていただけたらと思います。よろしくお願いします。
open(DATA,"ファイル名");
while(my $data = <DATA>){
chomp $data;
my ($key, $val) = split(/=/, $data);
$CONFIG{"$key"} = $val;
}
close(DATA);
if("$CONFIG{'password'}" eq "$passwd") {
というのはどうでしょうか?
ちなみに、改行削除目的であれば、chop ではなく chomp が良いですよ。
Perl のようですから、Config::Simple モジュールを使うのが手っ取り早いかと。
Config::Simple - simple configuration file class - search.cpan.org
そういうモジュールも存在するんですね。
たしかに、これを使うと簡単にできそうですね。
この方法も参考にしてみたいと思います。
前回投稿した際のソースもテストで試していたのですが、Form Get 部分を独自関数でやっていました。
それで気になって、hvordanさんのソースそのままでも試してみました。
環境:RedHat EL4 ES(Apache2.1 系)
ソース文字コードは全て EUC-JP
結論を言うと問題なく判定されてます。
状況追跡の方法ですが、まずは From 取得より前の段階で、
Perl ソース中に $confData{'password'} を宣言して、比較してはどうでしょうか?
それが上手くいったら、Form 取得の方法を用いて、空欄比較して…と。
現時点では、ソース側なのか、From 側なのか、原因箇所が絞れていないので。
hatena.html
$ cat hatena.html
<html><body>
<form method="POST" action="./cgi-bin/hatena.cgi">
id<input type="text" name="id">pw<input type="text" name="passwd"><input type="submit" value="send">
</form>
</body></html>
hatena.cgi
$ cat cgi-bin/hatena.cgi
#!/usr/bin/perl
print 'Content-Language: ja-JP' . "\n";
print 'Content-type: text/html' . "\n";
print 'Pragma: no-cache' . "\n\n";
use CGI;
my $cgi = CGI::new();
my $passwd = $cgi->param('passwd');
my $conf = "/path/to/cgi-bin/conf.pl";
my @readConfData = ();
if(open(FP, "<$conf")) {
flock(FP, 2);
while(my $line = <FP>) {
chop($line);
push(@readConfData, $line);
}
flock(FP, 8);
close(FP);
}
my $confLine = join('&', @readConfData);
my %confData = map { /([^=]+)=(.+)/ } split /&/, $confLine;
my $confPasswd;
$confPasswd = $confData{'password'};
if($confPasswd eq $passwd) {
print "OK : $confPasswd = $passwd\n";
} else {
print "NG : $confPasswd = $passwd\n";
}
conf.pl
$ cat ./cgi-bin/conf.pl
user=aaaaa
password=bbbbb
再度ありがとうございます。
いろいろ試してみたところ、
なぜか、パスワードを変えると何の問題もなくうまくいきました。
当初は暫定的にケータイの番号に設定していたんですけど、
他の文字列や、番号でも桁数を変えると正常に動きました。
なんで最初はじかれていたのかは原因不明ですが・・・。
さっそく回答ありがとうございます。
my ($key, $val) = split(/=/, $data);
こんな簡単な方法があったんですね。
で、さっそく試してみたんですけど、
やはりif文のところではじかれてしまうようです。
これもデバッガで実行した時はデータがちゃんと処理できているようなので、
コンフィグファイルの処理ではなくて、
もしや前のFORMから正常にパスワードが渡ってきていないのかも・・・。