認証後の画面遷移

このQ&Aのポイント
  • 現在、管理者名とパスワードを入力し、空白や特殊文字が入力された場合、管理者名やパスワードが間違っている場合などに、適切なページにリダイレクトさせたいですが、空白文字のページにしか遷移しない問題に悩んでいます。
  • HTMLのフォームを使用して、管理者名とパスワードを入力する画面を作成し、ログインボタンを押すと入力内容の確認を行い、適切なページにリダイレクトすることを目指しています。
  • 現在は、あらかじめ設定した管理者名とパスワードの組み合わせでは正しいページにリダイレクトできることを確認しました。しかし、空白や特殊文字が入力された場合や、正しい形式でない場合など、想定されるエラーケースに対応できていません。
回答を見る
  • ベストアンサー

認証した後の画面遷移

こんにちわ。現在、管理者名とパスワードを入力し、空白時、半角英数以外の入力がされたとき、管理者名もしくパスワードが違うときにそれぞれのページに飛ばそうと思っているのですが、どうしても空白字のページ(header( "Location: masterfalse01-01.php" );にしか行かず悩んでいます。ちなみに、あらかじめ決めた管理者とパスではきちんと次の画面に飛ぶことはできました。 <html> <head><title>認証</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <center><br>管理者名</br> <form method = "post" action = "shoppingmaster.php" > <input type = "text" name = "MASTERNAME"><br> <center><br>パスワード</br></center> <input type = "password" name = "PASS"> <p><input type = "submit" name = "submit" value = "ログイン"></p> </center> </form> <?php $MasterName = mb_convert_kana($str,"rna"); $Password = mb_convert_kana($str,"rna"); if($_POST["submit"] == "ログイン"){ if($_POST["MASTERNAME"] == "abc" && $_POST["PASS"] == "efg") { header("Location: shoppingform.php"); }else if( $MasterName == "" || $Password == ""){ header( "Location: masterfalse01-01.php" ); }else if(!ereg("^[A-Za-z0-9\-]",$MasterName, $Password )){ header( "Location: masterfalse01-02.php" ); }else { header( "Location: masterfalse01-03.php" ); } } ?> </body> </html> ご回答お願いできますでしょうか?

  • msnxl
  • お礼率81% (36/44)
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • kalze
  • ベストアンサー率47% (522/1092)
回答No.1

回答:if( $MasterName == "" || $Password == "")が必ず真だから。 解説: >$MasterName = mb_convert_kana($str,"rna"); >$Password = mb_convert_kana($str,"rna"); $strは初期化されていないため、常にNULL。 NULLをコンバートしても、常にNULL。 そのため、$MasterNameと$Passwordは常にNULL。 >if($_POST["MASTERNAME"] == "abc" && $_POST["PASS"] == "efg") これが正しいときのチェックだろう。 これは特に問題ない。 >if( $MasterName == "" || $Password == "") すでに書いたように、両方とも常にNULLなので、常に真となる。 そのため、ここより下の処理は発生しない。 関係ない補足1 >if(!ereg("^[A-Za-z0-9\-]",$MasterName, $Password )) IDとパスワードが半角英数及びハイフン以外が入っていたときに真となるようにしたいのなら、間違い。 仮に、$MasterNameと$Passwordに送信されてきたそれぞれの値を代入してあるとしても、このeregの構文だと、「$MasterNameの値について、先頭の1文字が半角英数またはハイフンである」を!で打ち消している。 ちなみに$Passwordには、正規表現内にマッチさせる()がないので、常にNULLがはいる。 つまり、ここのif文は、「$MasterNameの値の先頭1文字が半角英数またはハイフンでない」ときに真となる。 関係ない補足2 ほんとにこのまま書いてる場合、ブラウザによってはリダイレクトしてくれない。 理由1: header( "Location: masterfalse01-03.php" ); でのURLの指定は絶対URL。 つまり、http://とかhttps://とかから始めなければならない。 理由2: HTMLの途中に処理書いている場合、すでにそこまでのHTMLはクライアントに送信している。 つまり、すでにヘッダーも送信し終わっていて、ボディ部を送信している。 そこでheaderを送信しても、headerとして解釈してくれなくても、それは普通である。

msnxl
質問者

お礼

丁寧ね回答ありがとうございます。参考にした結果すぐに解決できました。

関連するQ&A

  • 管理パスワードによる認証

    既存のファイルに管理者による認証を付加したいと思いますが、下記のコードではうまくいきません。アドバイス下さい。 <?php //パスワードの設定 $password = "admin"; //パスワードチェック passchk(); function passchk(){ global $password, $post; $p = $post['pass']; if ($p == $password) { echo "認証成功!"; // return; } else { echo<<<EOM <p>パスワードを確認して下さい。</p><br> <form action="login.php" method="post"> パスワード:<input type="password" name="pass" size="8"> <input type=submit value="ログイン" /> </form> EOM; exit; } } ?>

    • 締切済み
    • PHP
  • 半角英数判定

    こんにちわ。最近PHPをやりはじめた者です。 下記のスクリプトを使用して空白判定はできたのですが、半角英数文字 を判定できなくて困っています。エラーが出てしまい、画面遷移できないのです。したいことは、半角英数文字以外がユーザーIDとパスワードに入力されたとき、「半角英数で入力してください」という判定をしたいのです。画面遷移後のスクリプトは文字制限の都合で記載できませんでした。  ユーザー名<br> <form method = "post" action = "subject02-01.php" > <input type = "text" name = "USERNAME"><br> パスワード<br> <input type = "password" name = "PASS"> <input type = "submit" name = "submit" value = "ログイン"> <?php $str = mb_convert_kana($str,"rna") if($_POST["submit"] == "ログイン") if($_POST["USERNAME"] == "root" && $_POST["PASS"] == "admin") { echo "認証に成功しました。"; } else if( $UserName == "" || $Password == "") else if(ereg("[A-Za-z0-9\-]",$str)) else { echo "認証に失敗しました。"; }

    • ベストアンサー
    • PHP
  • セッションを使わずに遷移先画面に変数の値を渡すには?

    <input type="hidden" value="myID">みたいな隠しフォームで 行く先々の画面に値をPOSTで渡してきました。 他方、 header("Location: mypage.php") のように画面を遷移させる場合、遷移先の画面に $_POST["myID"]のように値を渡すことはできませんか? この場合session_start();を使って、$_SESSION["myID"]のように値を 渡す(保持する)のが王道なのでしょうか? セッションと聞くと何かとトラブルになりやすそうなイメージがあり、 できれば使いたくないのです。 具体的に説明しますと、前にこの掲示板で教えていただいた、次の例を使っています。 入力文字チェックをかけたいのでPHP_SELFで同じ画面を呼び出して、 問題なければmypage.phpにリダイレクトさせる枠組みですが、 header("Location: mypage.php");という風に遷移した場合は、 遷移先のmypage.phpでは、$_POST["myID"]はPOSTされてきませんよね (値を受け取れませんよね)?? 妙案あればご教示下さい。 <?php if ($_POST["reg"] == "" ) $errFlg = true; if (!$errFlg) {     if (strlen($_POST["myName"]) > 30) {       $errFlg = true;       $errStr["myName"] = "30字以下";     }   $errMsg = "エラー!!"; } if ($errFlg) { ?> <html>   <body>     <form method="post" action="<?php $_SERVER["PHP_SELF"] ?>">       氏名 <input type="text" name="myName" value="<?= $_POST["myName"] ?>"><?= $errStr["myName"] ?>       <input type="hidden" name="myID" value="<?= $_POST["myID"] ?>">     </form>     <input type="submit" name="reg" value="登録">   </body> </html> <?php } else {     $sql = "update mytable set myID = 'xxxx'";     $rst = mysql_query($sql, $con);     header("Location: mypage.php"); } ?>

    • ベストアンサー
    • PHP
  • 認証画面について

    PHPにて認証画面を作ろうと思っております。 index.htmlより入力したデータをPOSTで飛ばし、PHPスクリプトにてIF文で認証判定をすると言う物なのですが…… ↓index.html <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=x-sjis"> <TITLE>PHP認証システム</TITLE> </HEAD> <BODY> <form action="./practice.php" method="POST"> <h2>認証システム</h2> <input type="text" name="id" value=""><br> <input type="submit" name="ninsyo" value="認証"><br> </form> </BODY> </HTML> ↓practice.php <?php echo $_POST["id"]; $num = intval($_POST["id"]); if ($num = 25) { echo '成功'; }else { echo '認証失敗'; } ?> どんな数値を入力しても、成功と表示されてしまいます。 何故でしょうか? 根本的に間違っているのでしょうか?

    • ベストアンサー
    • PHP
  • 他ページの入力内容を出力するには

    PHPあまり詳しくないです。 会員登録ページなるものを作っています。 register.phpというページで入力した会員情報をconfirm.phpというページで最終確認させたいのですが、その際に入力した情報がconfirm.phpに反映されません。 regiser.php <?php $a = (!empty($_POST['name'])); $b = (!empty($_POST['email'])); $c = (!empty($_POST['password'])); $d = (!strlen($_POST['password']) < 4); if (isset($_POST['check'])) { if ($a && $b && $c && $d) { header('Location: confirm.php'); } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> </head> <body> <h3>新規登録</h3> <form method="POST" action=""> <div class="container"> <label for="name">ユーザ名(20文字以内)</label> <br /> <input type="text" id="name" name="name" maxlength="20" /> </div> <?php if (isset($_POST['check'])) { if (empty($_POST['name'])) { print('※ユーザ名を入力してください'); } } ?> <br /><br /> <div class="container"> <label for="email">メールアドレス(100文字以内)</label> <br /> <input type="text" id="email" name="email" maxlength="100" /> </div> <?php if (isset($_POST['check'])) { if (empty($_POST['email'])) { print('※メールアドレスを入力してください'); } } ?> <br /><br /> <div class="container"> <label for="password">パスワード(4文字以上20文字以内)</label> <br /> <input type="password" id="password" name="password" maxlength="20"/> </div> <?php if (isset($_POST['check'])) { if (empty($_POST['password'])) { print('※パスワードを入力してください'); } elseif (strlen($_POST['password']) < 4) { print('※パスワードは4文字以上で入力してください'); } } ?> <br /><br /> <input type="submit" name="check" value="確認する" /> </form> </body> </html> confirm.php <?php $a = (!empty($_POST['name'])); $b = (!empty($_POST['email'])); $c = (!empty($_POST['password'])); $d = (!strlen($_POST['password']) < 4); if (isset($_POST['check'])) { if ($a && $b && $c && $d) { header('Location: confirm.php'); } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> </head> <body> <h3>新規登録</h3> <form method="POST" action=""> <div class="container"> <label for="name">ユーザ名(20文字以内)</label> <br /> <input type="text" id="name" name="name" maxlength="20" /> </div> <?php if (isset($_POST['check'])) { if (empty($_POST['name'])) { print('※ユーザ名を入力してください'); } } ?> <br /><br /> <div class="container"> <label for="email">メールアドレス(100文字以内)</label> <br /> <input type="text" id="email" name="email" maxlength="100" /> </div> <?php if (isset($_POST['check'])) { if (empty($_POST['email'])) { print('※メールアドレスを入力してください'); } } ?> <br /><br /> <div class="container"> <label for="password">パスワード(4文字以上20文字以内)</label> <br /> <input type="password" id="password" name="password" maxlength="20"/> </div> <?php if (isset($_POST['check'])) { if (empty($_POST['password'])) { print('※パスワードを入力してください'); } elseif (strlen($_POST['password']) < 4) { print('※パスワードは4文字以上で入力してください'); } } ?> <br /><br /> <input type="submit" name="check" value="確認する" /> </form> </body> </html> できればあまりこの形は変えたくありません…。 action部分をconfirm.phpに変えると、入力値が空だったりするエラー時にconfirm.phpに飛ばないようにする方法が分かりません。 回答よろしくお願いします。

    • ベストアンサー
    • PHP
  • メールとパスワードのログイン認証

    メールとパスワードのログイン認証のプログラムがいまいちできません。 訂正すべき箇所がお分かりになる方よろしくお願いします。 尚、下記php以外に、ログイン記録用のcgiファイルがありますがそちらはちゃんと記録されます。 希望のプログラムの流れは、メールとパスワードが記録されてなかったら登録してほしい画面を出します。クッキーもしくは投稿したメールとパスワードどちらか間違っていたら、「メールアドレスかパスワードが違います」と出します。 <?php #===================================== # パスワード設定 #===================================== #エラー画面(エラー処理) #DispError(TITLE,TOPIC); function disperror($title, $topic) { ?> <html> <head> <title><?=$title?></title> </head> <body> <?=$title?> <?=$topic?> </body> </html> <?php exit; } header("Content-Type: text/html; charset=Shift_JIS"); $passfile = "passfile.cgi"; $admin_array = @file($passfile); if (!isset($admin_array[0])) $admin_array[0] = ''; $admin = rtrim($admin_array[0]); list($adminmail,$adminpass)=explode("<>",$admin); if (!isset($_COOKIE['adminpass'])) $_COOKIE['adminpass'] = ''; if (!isset($_POST['adminpass'])) $_POST['adminpass'] = ''; if (!isset($_COOKIE['adminmail'])) $_COOKIE['adminmail'] = ''; if (!isset($_POST['adminmail'])) $_POST['adminmail'] = ''; if ($adminmail and $adminpass) { if (!$_COOKIE['adminpass'] and !$_POST['adminpass']) { ?> <html><head> <title>パスワード認証</title> </head> <body> <form action="<?=$_SERVER['SCRIPT_NAME']?>" method="POST"> メールアドレスを入力してください。<br> <input type="email" name="adminemail" ><br> 管理パスワードを入力してください。<br> <input type="password" name="adminpass" ><br> <input type="submit" value="送信"> </form> </body></html> <?php exit; } if ($_COOKIE['adminpass']) { if ($_COOKIE['adminmail'] !== $adminmail) { disperror("ERROR!", "メールアドレスかパスワードが違いますa"); exit; } if (crypt($_COOKIE['adminpass'],$adminpass) !== $adminpass) { disperror("ERROR!", "メールアドレスかパスワードが違いますb"); exit; } } if (!$_COOKIE['adminpass'] and $_POST['adminpass']) { if ($_POST['adminmail'] !== $adminmail) { disperror("ERROR!", "メールアドレスかパスワードが違いますc"); exit; } if (crypt($_POST['adminpass'], $adminpass) !== $adminpass) { disperror("ERROR!", "メールアドレスかパスワードが違いますd"); exit; } setcookie("adminmail",$_POST['adminmail']); setcookie("adminpass",$_POST['adminpass']); } } else{ if(!isset($_POST['setpass']) or !$_POST['setpass']) { ?> <html> <head> <title>パスワード設定</title> </head> <body> <div align="center"> パスワードが登録されていません。<br> <form action="<?=$_SERVER['SCRIPT_NAME']?>" method="POST"> メールアドレスを入力してください。<br> <input type="email" name="setmail" ><br> 新しいパスワードを入力してください。<br> <input type="password" name="setpass" ><br> <input type="submit" value="登録"><br> </form> </div> </body></html> <?php exit; } else { $admin = $_POST['setmail'] . "<>" . crypt($_POST['setpass']); $fp = @fopen($passfile, "w"); fputs($fp, $admin); fclose($fp); setcookie("adminmail",$_POST['setmail']); setcookie("adminpass",$_POST['setpass']); } } ?>

    • 締切済み
    • PHP
  • PHP初心者です。何処がエラーなのかさっぱり解りません。

    超初心者です。 PHPの勉強を始めたばかりで、いきなりつまずいています。 下記の表示になりエラーになっているのですが、何処がエラーなのか意味が解りません。 Parse error: syntax error, unexpected $end in C:\xampp\htdocs\phplesson\03\login.php on line 31 どなたか教えてください。 よろしくお願いします。 ----------------- <?php session_start(); $error_message = ""; //ログインボタンが押されたかを判定 if (isset($_POST["login"])) { if ($_POST["member_name"] == "php" && $_POST["password"] == "password") { //ログインが成功した証拠をセッションに保持 $_SESSION["login_name"] = $_POST["member_name"]; //管理者専用画面へWebブラウザをリダイレクトさせる $login_url = "http://{$_SERVER["HTTP_HOST"]}/phplesson/03/anq_result.php"; header("Location: {$login_url}"); exit; } $error_message ="メンバー名かパスワードを間違えています。"; } ?> <html> <body> <?php if ($error_message) { print '<font color="red">' .$error_message. '</font>'; } ?> <form action="/phplesson/03/login.php" method="post"> メンバー名:<input type="text" name="member_name" value="" /><br /> パスワード:<input type="password" name="password" value="" /><br /> <input type="submit" name="login" value="ログイン" /> </form> </body> </html>

    • ベストアンサー
    • PHP
  • php $_SESSIONで値が消える。

    いつもお世話になり誠にありがとうございます。 標記の件。 インプット画面ー>確認画面ー>戻るー>インプット画面 インプット画面に戻った時、どうしても最初のインプット画面で打った内容が消えてしまいます。 プログラムを診て、誤りを指摘して頂けないでしょうか? どうぞよろしくお願い致します。           記 <?php session_start(); $mode = 'input'; if( isset($_POST['back']) && $_POST['back'] ){ //何もしない } else if( isset($_POST['confirm']) && $_POST['confirm'] ){ $_SESSION['name'] = $_POST['name']; $_SESSION['email'] = $_POST['email']; $_SESSION['category']= $_POST['category']; $_SESSION['message'] = $_POST['message']; $mode = 'confirm'; } else if( isset($_POST['send']) && $_POST['send'] ){ $mode = 'send'; } else { $_SESSION['name'] =""; $_SESSION['email'] =""; $_SESSION['category']=""; $_SESSION['message'] =""; } ?> <!DOCTYPE html> <html lang="ja"> <head> </head> <body> <div class="v_line_fix"> <h1>Blog K・T</h1> <h2><a href="index.html">トップページ</a></h2> <?php if( $mode=='input'){ ?> <form method=post> お名前(ニックネーム)<br> <input type="text" name="name" value="<?php echo $_SESSION['name'] ?>"><br> Eメール<br> <input type="email" name="email" value="<?php echo $_SESSION['email'] ?>"><br> カテゴリー<br> <input type="text" name="category" value="<?php echo $_SESSION['category'] ?>"><br> 本文<br> <textarea style="font-size:1.5em;" cols="30" rows="80" name="message"><?php echo $_SESSION['message'] ?></textarea><br> <input type="submit" name="confirm" value="確認" /> </form> <?php }else if( $mode=='confirm'){ ?> <!--確認画面--> <form method="post"> <?php echo $_SESSION['name']?><br> <?php echo $_SESSION['email']?><br> <?php echo $_SESSION['category']?><br> <br> <?php echo nl2br($_SESSION['message'])?><br> <input type="submit" name="back" value="戻る"/> <input type="submit" name="send" value="送信"/> } </form> <?php } else { ?> <!--完了画面--> <?php } ?> </body> </html>

    • ベストアンサー
    • PHP
  • 他ページの内容を出力するには

    PHPあまり詳しくないです。 会員登録ページなるものを作っています。 register.phpというページで入力した会員情報をconfirm.phpというページで最終確認させたいのですが、その際に入力した情報がconfirm.phpに反映されません。 regiser.php <?php $a = (!empty($_POST['name'])); $b = (!empty($_POST['email'])); $c = (!empty($_POST['password'])); $d = (!strlen($_POST['password']) < 4); if (isset($_POST['check'])) { if ($a && $b && $c && $d) { header('Location: confirm.php'); } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> </head> <body> <h3>新規登録</h3> <form method="POST" action=""> <div class="container"> <label for="name">ユーザ名(20文字以内)</label> <br /> <input type="text" id="name" name="name" maxlength="20" /> </div> <?php if (isset($_POST['check'])) { if (empty($_POST['name'])) { print('※ユーザ名を入力してください'); } } ?> <br /><br /> <div class="container"> <label for="email">メールアドレス(100文字以内)</label> <br /> <input type="text" id="email" name="email" maxlength="100" /> </div> <?php if (isset($_POST['check'])) { if (empty($_POST['email'])) { print('※メールアドレスを入力してください'); } } ?> <br /><br /> <div class="container"> <label for="password">パスワード(4文字以上20文字以内)</label> <br /> <input type="password" id="password" name="password" maxlength="20"/> </div> <?php if (isset($_POST['check'])) { if (empty($_POST['password'])) { print('※パスワードを入力してください'); } elseif (strlen($_POST['password']) < 4) { print('※パスワードは4文字以上で入力してください'); } } ?> <br /><br /> <input type="submit" name="check" value="確認する" /> </form> </body> </html> confirm.php <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>確認画面</title> </head> <body> <h3>入力内容を確認してください</h3> <form method="POST" action=""> <br /><br /> <p>ユーザ名</p> <br /> <?php print htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8'); ?> <br /> <p>メールアドレス</p> <?php print htmlspecialchars($_POST['email'], ENT_QUOTES, 'UTF-8'); ?> <br /> <p>パスワード</p> <?php print htmlspecialchars($_POST['password'], ENT_QUOTES, 'UTF-8'); ?> <br /><br /><br /> <?php print('この内容でよろしければ下の登録ボタンを押してください'); ?> <br /> <form method="POST" action="dbconnect.php"> <input type="submit" name="completion" value="登録する" /> </form> <br /><br /> <?php print('変更がある場合は下の戻るボタンを押してください'); ?> <br /> <form method="POST" action="register.php"> <input type="submit" value="戻る" /> </form> </body> </html> できればあまりこの形は変えたくありません…。 action部分をconfirm.phpに変えると、入力値が空だったりするエラー時にconfirm.phpに飛ばないようにする方法が分かりません。 回答よろしくお願いします。 色々と間違えていたのであげ直させていただきました。

    • 締切済み
    • PHP
  • 現在PHPの勉強をしています。初心者のためご教授いただければと思います

    現在PHPの勉強をしています。初心者のためご教授いただければと思います。 メールフォームを作成しており、エラーチェックで困っています。 簡単に流れを説明しますとフォーム画面で入力をしてもらったら確認画面へと移行します。 ここでエラーがあった場合、confirm.phpにてエラーチェックをし、form.phpに戻り、エラーがなければ確認画面にて入力した、項目が表示されるようにしたいと思っています。 ソースは下記のとおりになります。 form.php ---------------------- */ <html> <body> <form action="confirm.php" method="post"> 名前:<input type="text" name="name" value="" /<?php echo $errmsg['name'] ;?><br> 内容:<textarea name="comment" rows="5" cols="40"></textarea><?php echo $errmsg['comment'] ;?><br> <input type="hidden" name="contact" value="form" /> <input type="submit" name="submit" value="確認" /> </form> </body> </html> confirm.php ---------------------- */ <?php $name = $_POST['name']; $comment = $_POST['comment']; if(isset ($_POST['contact'])) { $errmsg = array(); if(empty($name)){ $errmsg['name'] = '未入力'; } if(empty($comment)){ $errmsg['comment'] = '未入力'; } if (count($errmsg) != 0) { header("Location: index.php"); exit; } } ?> <html> <body> 名前:<?php echo $name; ?><br /> 内容:<?php echo $comment; ?><br /> </body> </html> としております。 if (count($errmsg) != 0) { header("Location: form.php"); exit; 上記のようにするとエラーチェックの表示がされません。 require(form.php);にするとform.phpが表示されるのですがURLを見るとconfirm.phpの状態になっております。 header("Location: form.php");を使用してのエラーチェックをしたいのですが、どのように記述したらよろしいのでしょうか? 上記の内容でどなたかご教授いただけないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう