人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

次のことを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) {
データ表示?


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

●質問者: hvordan
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:CGI EQ Flock FP MAP
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● arcana
●27ポイント

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/

◎質問者からの返答

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

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

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

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

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

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

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

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


2 ● b-wind
●27ポイント

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

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

◎質問者からの返答

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

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

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


3 ● arcana
●26ポイント

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

◎質問者からの返答

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

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ