if文が・・・??

このQ&Aのポイント
  • CGIの認証部分を改造中です。各ユーザーのパスワードと管理人パスワードを設定し、ユーザーと管理人での記事の修正を実現するためにif文を使用しています。
  • しかし、条件文の書き方が間違っているのか、エラーが発生してしまいます。同じ文法なのに異なる結果が出ることに疑問を抱いています。
  • もしも何かおかしい部分があるのなら、正しい書き方や修正方法を教えていただけると幸いです。
回答を見る
  • ベストアンサー

if文が・・・??

CGIの認証部分を改造中です。 修正画面に入るとき、各ユーザーのパスワードと管理人パスワードを設定し、ユーザーなら自分の記事の一部を管理人なら記事とユーザー名等の修正が出来るというものです。 さて、以下のように作りました。 if ($in{'pass1'} ne $pass || $in{'pass1'} ne "$adminpass"){&error("パスワードが違います.$pass.$in{'pass1'}.$adminpass.");} あ、後ろのほうは確認用です。 これだと、文法的に間違えはないとおもうのですが、エラーが帰ってきます。 もちろん、「$passと$in{'pass1'}」または「$in{'pass1'}と$adminpass」は同じです。 ちなみに、 if ($in{'pass1'} ne $pass){&error("パスワードが違います");} とすると、ちゃんと通るし、 if ($in{'pass1'} ne "$adminpass"){&error("パスワードが違います");} こっちでもちゃんと通ります。 もちろん、PASSはちゃんと変更してです。 これって何かおかしいですか? 出来れば、「ここはおかしくないよ」という回答もお待ちしてます。

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

文法的には間違いではないと思いますが、 例えば、 $in{'pass1'} eq $pass の時 $in{'pass1'} ne "$adminpass" の方は成立してしまい &error が呼び出されるというようなことだと思います。 よって || でつなぐのではなくて && でつなげばいいんじゃないかと思います。

master-3rd
質問者

お礼

ありがとうございます。 &&と||の使い方を勘違いしてたようです。 無事予定通りの動きをしてくれるようになりました。

関連するQ&A

  • if文がうまく書けない(T.T)

    某CGIを改造してます。 CGIにIDとPassを組み込もうとしているのですが、うまくできません。 いろいろな認証CGIを真似してやっているのですが… sub pass2{ open (FILE,"$passdata"); @file = <FILE>; close FILE; foreach (@file) { local($nm,$ps)= split(/,/,$_); if ($nm eq $in{'name'} && crypt($in{'password'},$ps) eq "$ps") { &admin; exit; } } &error("認証に失敗しました?"); } この状態だと動くことは動くのですが、ちょっと面倒なので逆転させたいんです。 そこで以下のように作り変えてみました。 if ($nm ne $in{'name'}) { &error("名前が違います"); exit; } if ($nm eq $in{'name'} && crypt($in{'password'},$ps) ne "$ps") { &error("パスワードが違います。"); exit; } } &admin } こうすると、なぜか正しい名前を入れても「名前が違います」のメッセージが出ます。 いったいどこが間違っているのですか? 言語はperlです。 お願いします。

    • ベストアンサー
    • CGI
  • CGIでパスワードのセキュリティについて

    CGIで管理者用パスワードを設定しますが(画面入力と比較するワード)、 このパスワードは インターネットからファイルをダウンロードするアプリ ケーションなどでソースを見られてしまう事は無いのでしょうか? もし見られてしまう場合 何か防ぐ方法は有りませんか? xxx.cgi?pass=pass1234 とかやれば良いでしょうか? # 管理用パスワード $pass = 'pass123'; ←これです パスワード <input type=password name=pwd size=8> if ( $in{'pwd'} ne $pass ) { &error("パスワードが違います"); } サーバーは ニフティ又はビックローブを予定。

    • ベストアンサー
    • CGI
  • IF文でページ振り分けがうまく出来てない。

    CGI勉強中です。 ある掲示板CGIを改造して会員のみに使用可にしようと考えています。パスワード自体は無事組み込むことが出来たのですが、1つ問題が出ました。 掲示板なので、過去ログがありますよね。その過去ログページを表示しようとするとまた認証ページに戻ってしまい、パスワードを再度入力→最新10件のページに戻ってしまいます。どうにかして、1度入ったらパスワードを入力しなくてもいいようにしたいのですが… 今のところこうなってます。 /////////////// if ($pass_mode == '1'){ ←もしパスを使用するだったら if ($F{'mode'} eq '') { &pass_mode} ←モード無しの場合、パス入力画面に移動 if ($F{'mode'} eq 'admin') { &admin} ←モードアドミニならsub adminへ } else{ if ($F{'mode'} eq '') { &main_form} ←メイン書き込みページへ else { &{$F{'mode'}} } } /////// となっています。 また、過去ページへの移動は「**.cgi?pg=10&sort=」という感じです。 この状態で、ページ移動時にパス入力ページに移動しないようにするにはどうしたらいいでしょうか?cookieを使う必要があったりしますか? 抜けてる情報・足りない情報があったら指摘してください。すぐ補足します。言語はperlで書いています。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • パスワード認証 ページに飛べない

    パスワード認証のページを作っています。 パスワードがあっているかどうかで、ページに飛ぶようにしたいのですが、どうも上手くいきません。どこがいけないのでしょうか? $user_pass = "test"; // パスワード $ok = "./ok.htm"; // 認証クリア後に飛ばす相対パス。 $error = "./error.htm"; // 認証ミス後に飛ばす相対パス。 $script = "./login.php"; // このファイル名 $doc_title = "テスト"; // タイトル /*-----------------------------------------------------------*/ /* ログイン処理 /*-----------------------------------------------------------*/ if(!isset($ver)) { $ver = '1.05.1'; } if(!isset($pass)) { $pass = $user_pass; // パスを指定 if($passwd == $pass) { header("Location: $ok"); // OKなら } elseif($passwd) { header("Location: $error"); // NGなら } } ?>

    • ベストアンサー
    • PHP
  • 削除する記事が存在しない場合の処理

    投稿すると自動的にその投稿に対して記事番号なるものが割り当てられ、 その記事番号と自分で投稿時に決めた削除パスワードで 自分の投稿を削除する形式の掲示板なのですが パスワードや記事番号が入力されていない場合には 〇〇〇が入力されていませんと表示されるにもかかわらず 存在しない記事番号が入力して削除しようとすると 「正常に削除いたしました」と表示されてしまいます。 (実際には存在しない記事番号なので何も削除されていないのですが) そこで下記のようにの#~#の部分を追加で記述し、 記事番号が存在しない場合にエラーとなるようにしてみたのですが これで本当にいいのか正直不安なのです。 正しいかチェックしていただけませんか? @new=(); open (IN,"$file") || error("システムエラー","ファイル「$file」を開くことができません。"); while($data = <IN>) { $flag=0; ($no,$res,$date,$cntr,$email,$tall,$weight,$age,$sub,$com,$live,$select,$photo,$pw) = split(/<>/,$data); if ($FORM{'pass'} eq "$ad_pass") { foreach $del (@DEL) { if ($no eq "$del") { $flag=1; last; } } } else { if ($FORM{'del'} eq "$no") { if (!($pw)) { &error("入力エラー","指定された記事には削除キーが設定されていません。"); } if (crypt($FORM{'pass'},$pw) ne "$pw") { &error("入力エラー","パスワードが間違っています。"); } $flag=1; } #記事番号が存在しない時、エラーを表示追加 if ($FORM{'del'} ne "$no") { if (crypt($FORM{'pass'},$pw) ne "$pw") { &error("入力エラー","記事番号が存在しません。記事番号を確認して入力し直してください。"); } } #ここまで } if ($flag == 0) { push(@new,$data); } } close (IN);

    • ベストアンサー
    • Perl
  • 変数の受け渡し

    アップローダのスクリプトにダウンロードパスをつけようと日々頑張っているのですが、なかなかうまく出来ません。 例.No1をダウンロードしたい場合 一覧ページからNo.1の記事を選択       ↓ No.1をダウンロードするためのパス入力画面       ↓ No.1ダウンロードページ 上記のようにしたいのですが、 記事表示CGIからパスワードCGIへ変数を渡そうとしていますがなかなかうまくいきません。 ***記事表示CGIのパスワード入力画面*** <form action="パスワードCGIのパス" method="POST"> <input type=hidden name=No value="$no"> <input type=password name=pass size=10> <input type=submit value="認証"> ***パスワードCGIでの条件分岐*** if ($in{'pass'} ne $loginpass) { print "認証画面に戻って再度パスワードを入力して下さい\n"; } print "Location: 記事表示CGIのダウンロードページ&kno=$no\n\n"; exit; としているのですが、変数$noをパスワードCGIの方で取得できません。 CGIは最近弄り始めたばかりなのでぜんぜん分からなくて…。 そもそも <input type=hidden name=No value="$no"> でパスワードCGIの方に$noが送られているのでしょうか? 送られているのでしたら$noの取得方法を教えていただけないでしょうか。 よろしくお願いします。 P.S.拙い文章の為、分かりにくいところなどがありましたら質問してください。 分かる限りはお答えしたいと思います。

    • ベストアンサー
    • CGI
  • A.cgiで認証チェックされてから、B.thmlが表示されるようにしたい。

    1/17付CGIについての質問の関連です。 質問はパスワード付forum.cgi(付録フリーCGI)で、forum.cgiを入室後、ID&PW情報をA.cgiに渡したまま、新しいHTMLウィンドウを立上げることでした。 この質問は、こちらの教えてGOOでご教授いただきました。ありがとうございます。 できたCGIでは、A.cgiでID&PWを入力しないでも、B.thmlが表示されてしまいます。 # ID/PW認証 # sub pass_check { local($time,$time2,$inpw,$flag,$id,$pw,$check); # 時間を取得 $time = 略; $timeout = 略; $password = '略'; $pwdfile = '略; #中略 if ($in{'id'} eq "") { &header; print "<table><tr><td>\n"; print "<td><form action=\"$script\" method=\"GET\"onsubmit=\"window.open('B.html,'new')\">\n"; print "<tr><th><UL><LI>すでにパスワード取得済みの方は・・・略 print "<tr><th>ログインID<th><input type=text name=id size=8></tr>\n"; #中略 print "<tr><th colspan=2><input type=submit value=' 認証する '></tr>\n"; #中略 if ($in{'pw'} eq "") { &error("パスワードの入力モレです"); } $flag=0; open(IN,"$pwdfile") || &error("Open Error : $pwdfile"); while (<IN>) { ($id, $pw) = split(/:/); if ($in{'id'} eq $id) { $flag=1; $pw=~s/\n//; last; } } close(IN); if (!$flag) {&error("該当のIDは見当たりません"); } $check = &decrypt("$in{'pw'}", "$pw"); if ($check ne "yes") { &error("パスワードが違います"); } # パスワードを第2暗号化 以下略 } 認証の送信をしたときに、エラー時エラーメッセージに飛ぶ(分岐する?)にはどういう記述にしたら良いでしょうか? 見にくいかもしれませんが、どんなヒントでも結構ですので宜しくお願いします。

    • 締切済み
    • CGI
  • CGI Perlでの認証について

    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のときも同じくエラーでした。 どこが問題なのでしょうか?昨日から考えてずっとわからないのでご回答よろしくお願いします。

    • ベストアンサー
    • Perl
  • cgiでのユーザーIDとパスワードの認証

    パスワードの確認しかないcgiにユーザーIDの認証も追加したいのですが、どのように変更すれば良いのかわかりません。皆さんのアドバイスよろしくお願いします。 ※ユーザーID $text = 'test' # パスワードの確認 if ($formdata{'pass'} eq $password or $cookies{'pass'} eq $password) { $access = $upload = $delete = 1; $cookie = "Set-cookie: pass=$password\n"; } elsif ($formdata{'pass'} or $cookies{'pass'}) { $form_log .= "パスワードが正しくありません。<br>"; }

  • PerlでLinuxのユーザー認証・管理プログラム

    ブラウザでLinuxのユーザー名とパスワードと入力して、 ユーザー認証してログイン後、Linuxユーザーの パスワードを自分で変更できるプログラムが作りたいのです。 /etc/passwdにパスワードが直接記録されていれば簡単なのでしょうが、 シャドウパスワードなので苦労しています。LinuxはFedora Core3です。 まず、/etc/shadowに記録されているような、 $1$ではじまる暗号化されたシャドウパスワードをPerlで作るには どのようにしたらいいのでしょうか。 pwconvのソースをみたらどんなアルゴリズムかわかると思い、 shadow-utilのSRPMをインストールしてみたりしましたがわかりませんでした。PHPのメーリングリストに $salt = substr(md5(microtime()), 0, 9); return crypt($password, "$1$" . $salt); このようなコードがあったのですが、これでは$saltが毎回 代わってしまい、よくある $salt=substr(暗号化されたパスワード,0,2); if(crypt($pass,$salt) ne 暗号化されたパスワード){ &err("パスワードが違います"); } のような認証ができないのではないかと思いました。 Linuxではどのようなアルゴリズムでシャドウバスワード を作り、パスワードの認証をしているのでしょうか。 つまり、簡単にいうとPerlでシャドウパスワードを使った Linuxユーザーのパスワード認証と パスワード変更ができないか、ということなのです。 また、Perlでシャドウパスワードなど作らなくても system()などを使ってLinuxのコマンドを使えば 各ユーザーの認証やパスワードの変更がブラウザでできるという場合は、 教えていただけないでしょうか。 どうかご教示ください。よろしくお願いします。

専門家に質問してみよう