![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
CGIにてログイン認証の処理を使用してみたく勉強がてら
Perlにて作成しているのですが、どうもうまくいかない
ので質問させてもらいます。
ID・パスワード保存用ファイルfile.datにあらかじめ
100<>p34z7
500<>332bdz
といった感じで入力してまして、
ログインボタンを押したときに
&login_chk($post{'id'},$post{'pwd'});
(URIデコード処理して$post{'id'},$post{'pwd'}を取得します)
を実行して下記サブルーチンを呼び出します。
sub login_chk {
my ($in_id, $in_pass) = @_;
my ($id, $pass);
my $data;
if (!open (IN, "./file.dat")) {
&Error("ファイルが開けません");
}
while ($data = <IN>) {
($id, $pass) = split(/<>/, $data);
if ($in_id eq $id){ last; }
}
close(IN);
unless ($in_pass eq $pass) {
&Error("正しいID・パスワードを入力してください");
}
}
※現状ファイルロックの処理はしてません。
パスワードの暗号化もしてません。
で、IDに100、パスワードにp34z7と入力してログインしようとするのですが
「正しいID・パスワードを入力してください」とエラーが出てきます。
当然500のときも同じくエラーでした。
どこが問題なのでしょうか?昨日から考えてずっとわからないのでご回答よろしくお願いします。
No.2ベストアンサー
- 回答日時:
#1です。
補足ありがとうございました。
>"$in_pass,$pass正しいID・パスワードを入力してください"とかいった感じでエラーが出たときの値を見てみたのですが同じ文字(500の場合p34z7)が表示されてます。
$in_passと$passが知りたいのではなく$post{'id'}と$post{'pwd'}の値がきちんと入ってきているのか知りたいです。
ちょっと試してみましたが、
---
while ($data = <IN>) {
($id, $pass) = split(/<>/, $data);
---
上記の部分の間に以下を入れてください。
chomp ( $data ) ;
$passの後ろに"\n"が含まれてませんか?
なのでunless判定でNGになってます。
この回答への補足
回答ありがとうございます。
補足かお礼かどちらに出したらよかったかわからなかったのですが、取りあえず補足で投稿します。
指示通り間に
chomp ($data);
を入れたのですが駄目でした。
やっぱり$post{'id'}と$post{'pwd'}の値がちゃんと取得
できてないのでしょうか?
下記のコードで取得してるんですが。。。
if ($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
my @pairs = split(/&/, $query);
foreach my $pair (@pairs) {
my ($key, $value) = split(/=/, $pair);
$key = &UrlDecode($key);
$value = &UrlDecode($value);
&jcode'convert(*value, 'sjis');
$post{$key} = $value;
}
}
sub UrlDecode {
my ($string) = @_;
# 16進数から変換
$string =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
$string =~ s/\+/ /g;
return $string;
}
すいません。問題ありますか?
本当にすいません。
もう一度見直してみたら
chomp ( $data ) ;
を入れる場所を間違えてました。情けない。
指示通りの場所に入れてみたら問題なく認証できました。
感謝します。
No.4
- 回答日時:
my ($in_id, $in_pass) = @_;
ここの $in_pass ですが my でレキシカル変数として宣言されてますので、
サブルーチン login_chk 内でのみ有効のはずです。
なので、unless のところで $in_pass が無効になってるんじゃないでしょうか。
先ほどの宣言を login_chk の外に出してみたらどうなりますか?
my ($in_id, $in_pass) = ();
sub login_chk {
($in_id, $in_pass) = @_;
my ($id, $pass);
my $data;
if (!open (IN, "./file.dat")) {
&Error("ファイルが開けません");
}
No.3
- 回答日時:
#1,2です。
unless ($in_pass eq $pass) {
&Error("正しいID・パスワードを入力してください");
}
上記のロジックを
unless ($in_pass eq $pass) {
&Error("$post{'id'}と$post{'pwd'}正しいID・パスワードを入力してください");
}
として確認してください。
$post{'id'}と$post{'pwd'}にはそれぞれなんと入っていますか?
これで$post{'id'}と$post{'pwd'}に正しい情報が入っていない場合は、質問者様が書かれているurlDecode処理に間違いがあるはずです。
何度もすいません。
&Error("$post{'id'}と$post{'pwd'}正しいID・パスワードを入力してください");
この通り変更して確認したのですが、正しく表示されますねぇ。
100の場合はp34z7で500の場合は332bdzです。
現在ローカルの環境(WinXP PRo+Apache1.3+ActivePerl5.8)でのテストですが別に関係ないですよね?
取りあえずもう一度一からやり直してみます。
いろいろありがとうございました。
No.1
- 回答日時:
初めまして!補足要求です。
以下の処理で
&login_chk($post{'id'},$post{'pwd'});
$post{'id'}と$post{'pwd'}にはきちんと正しいIDとパスワードは入っていることを確認されましたか?
この回答への補足
早速の回答どうもです。
確認としては
&login_chk($post{'id'},$post{'pwd'});
の前にそれぞれ入力されているかのチェックと、
あとちゃんと取得できているのかどうかと思い
unless ($in_pass eq $pass) {
&Error("正しいID・パスワードを入力してください");
}
の"正しいID・パスワードを入力してください"の部分に
"$in_pass,$pass正しいID・パスワードを入力してください"とかいった感じでエラーが出たときの値を見てみた
のですが同じ文字(500の場合p34z7)が表示されてます。
こんな確認方法では駄目なのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP php ログイン 1 2022/11/01 00:24
- PHP preg_matchで Warning: Undefined variableが出ます 1 2022/11/15 17:06
- Yahoo!メール YahooIDをパスワード形式にしただけなのに、利用規約違反とされて電話番号が使えなくなりました 3 2023/03/25 04:08
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Yahoo!メール YahooIDをパスワード形式にしただけなのに、利用規約違反とされて電話番号が使えなくなりました 1 2023/03/15 20:44
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
laravelを利用してコントロール...
-
CGI Perlでの認証について
-
PHP ボタンが押されたら処理を...
-
フォームで作った送信ボタンが...
-
ボタンをクリックでPHP文を実行
-
チェックボックスを使った複数...
-
セッションを使わずに遷移先画...
-
HTMLで前の画面に戻る時、入力...
-
<input type="hidden" >で配列...
-
テキストリンクをPOST送信したい
-
1つのphpファイルで、入力フォ...
-
複数行のデータ一括更新に関して
-
チェックボックスによる検索
-
サブフォルダ内の全てのテキス...
-
PHP で画面の一部だけを変えたい。
-
【PHPチェック】ラジオボタンが...
-
php セレクトボックス 値取得
-
カスタムフィールドテンプレー...
-
Flaskでサーバー立ち上げに関して
-
マクロ(VBA)について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
laravelを利用してコントロール...
-
$_SERVER['REQUEST_METHOD']と"...
-
プログラムの複製(VB.net)
-
POSTの値を配列として受け取っ...
-
POSTを使わずに値を渡す方法
-
【smarty】予約変数に可変変数
-
高高兴兴は高兴と何が違います...
-
functionsでどこまで括るのか固...
-
wordpressでのパーマリンクの表...
-
海外郵便 宛名国名のスペル教えて
-
サーバ上でGETはできるがPOSTが...
-
ini_setのpost_max_size
-
郵便番号検索
-
自作PHPブログでの記事を5件ず...
-
pythonのhttp.serverでpostされ...
-
昭和40年の現金書留での送金...
-
RSSと投稿記事を交互に表示させ...
-
データベースの情報をサイトに...
-
淡路島の洲本にレンタカーはあ...
-
大鏡「若き日の道長」の訳
おすすめ情報