次のことをCGIで行うにはどうすればよいか、ご教授いただきたいです。


各パラメータを"="で関連付けたコンフィグファイルを用意して、その中から“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) {
データ表示~


上のように書いていて、デバッガで試してみて想定どおりの値が入っていても、パスワードを突き合わせるところで弾かれてしまいます。それ以前に、かなり回りくどいやり方になっていて、もっと簡単な方法があるようにも思ってはいるのですが。ヒントを教えていただけたらと思います。よろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/03/21 23:00:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:arcana No.1

回答回数120ベストアンサー獲得回数10

ポイント27pt

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 が良いですよ。

http://dummy/

id:hvordan

さっそく回答ありがとうございます。

my ($key, $val) = split(/=/, $data);

こんな簡単な方法があったんですね。

で、さっそく試してみたんですけど、

やはりif文のところではじかれてしまうようです。

これもデバッガで実行した時はデータがちゃんと処理できているようなので、

コンフィグファイルの処理ではなくて、

もしや前のFORMから正常にパスワードが渡ってきていないのかも・・・。

2007/03/14 23:28:47
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント27pt

Perl のようですから、Config::Simple モジュールを使うのが手っ取り早いかと。

Config::Simple - simple configuration file class - search.cpan.org

id:hvordan

そういうモジュールも存在するんですね。

たしかに、これを使うと簡単にできそうですね。

この方法も参考にしてみたいと思います。

2007/03/16 06:33:46
id:arcana No.3

回答回数120ベストアンサー獲得回数10

ポイント26pt

前回投稿した際のソースもテストで試していたのですが、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

http://dummy/

id:hvordan

再度ありがとうございます。

いろいろ試してみたところ、

なぜか、パスワードを変えると何の問題もなくうまくいきました。

当初は暫定的にケータイの番号に設定していたんですけど、

他の文字列や、番号でも桁数を変えると正常に動きました。

なんで最初はじかれていたのかは原因不明ですが・・・。

2007/03/16 06:37:01

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません