• 締切済み

$_POSTの使い方

現在ログイン型情報サイトを運用しております。 ログインはPEARのAuthを使用しております。 ログイン認証やログイン判定後のページ表示やDB操作等について isset($_POST['hoge']) や if($_POST['hogehoge']) == xxxx) など 複数の場所でPOSTされた値を判定に使っております。 このサイトを丸ごとコピーして、アクセスした時点で既にログインしている状態を作らなければならなくなりました。 値をセッションに入れる時等、 $_SESSION['hoge'] = "yyyy"; のようにしますよね。 同様(かどうかわかりませんが・・・)に値があたかもPOSTされた状態を作る方法として if(!isset($_SESSION['username'])){ $_POST['username'] = "zzzz"; $_POST['password'] = "vvvv"; その他ログイン時にPOSTされる値を同様に$_POSR['aaaa']として書く } というコードを書いて、あたかもログインボタンを押してログインしたかのような状態を作る事はできたのですが、このような手法は上記状態を作るために行う手段としては正しいのでしょうか? またセキュリティ等、自分が気づかないような穴があるかどうか心配です。 手法としてやってもよい事なのか、よくない事なのか、気をつけなければいけないことが何かあるのか等、どなたかアドバイスをいただけないでしょうか?

  • PHP
  • 回答数2
  • ありがとう数3

みんなの回答

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.2

自前でcount($_POST)と書いた記憶はないですが PEAR::HTML_QuickFormの送信検証でそのロジックがあったと思うので 自分以外の人が触れることを考慮すると怖いですね。 ログインの判定やタイミングが把握できていないので 修正云々については控えておきます。。

gogo-tea
質問者

お礼

回答ありがとうございます。 PEARは現在Authの使用のみです。 まあこれから先はわかりませんが^^; いずれにしても正常処理としてPOSTされる変数の数と、「あたかも処理」で記述する$_POST変数の数が一致していれば#1.2さんが懸念してらっしゃる問題に関してはクリアですよね? とりあえず上記に記述した処理で運用してみます。 暫定処理であることを先方に把握してもらい、ログ等をこまめにチェックして何か問題があれば随時対応していこうと思います。

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.1

POSTされてないものを$_POSTに入れるのは個人的にはすごく嫌です。 今回の場合はちょっと違うかもしれませんが、 if (count($_POST)) {} のような処理があったなら動作が狂います。 全てのソースを把握していて管理していけるなら 今一番楽なやり方でも構わないと思いますが。

gogo-tea
質問者

お礼

回答ありがとうございます。 >POSTされてないものを$_POSTに入れるのは個人的にはすごく嫌です。 私も初めて書く処理ですし、すごく違和感を感じます。 #1さんがすごく嫌な理由というのは$_POSTをカウントする処理がある場合だけでしょうか? もしそうであればそのような幸いそのような処理は行っていません。 逆にカウントする処理がなければ他には問題ありませんでしょうか? >全てのソースを把握していて管理していけるなら 全てのphpファイルの管理は私がしておりますのでファイル内のロジックに関しては全て把握しております。 「あたかも処理」にしたかった理由として、しばらくしたら元に戻す可能性が高いので、他の部分のロジックを変えたくないというのがあるんです。。 全面的に変更をかけるのであれば一旦phpファイルを全てコピーして、認証処理や判定処理を全て削ってしまうのが一番だと思うのですが、判定のロジックを使用しているphpファイルの数が数十ファイルありますので効率的にどうかなと思いまして今回の処理を思いついた次第です。

関連するQ&A

  • if (isset($_POST["body"]) && $_POST

    if (isset($_POST["body"]) && $_POST["body"])の中の&& $_POST["body"]って必要ですか? PHPのプログラムを読んでいて、以下のような部分を見つけました if (isset($_POST["body"]) && $_POST["body"]) しかし、どうせisset($_POST["body"])でnullかどうか、値が入っているかどうかを確めているので、&& $_POST["body"]の部分は必要ないように思います。なぜこのような書き方をしているのでしょうか?

    • ベストアンサー
    • PHP
  • PHPのログイン処理について

    PHPのログイン処理について教えてください。 「login_auth.phpファイル」 <?php //session開始 session_start(); session_regenerate_id(true); //エラーメッセージを格納する変数を初期化 $error_message=""; //ログインボタンが押されたかを確認 if(isset($_post["sub"])){ if($_post["auth_id"] == "auth" && $_post["auth_pass"] == "1234"){ //ログインが成功した証拠をセッションに保持する $_session["login_name"] = $_post["auth_id"]; //管理者トップへWebブラウザをリダイレクトさせる $login_url = "http://{$_server["http_host"]}/reservation/auth_top.php"; header("Location: {$login_url}"); exit; } $error_message = "IDかPASSが間違えています"; } ?> <html> <body> <?php if($error_message){ print '<font color="red">'.$error_message.'</font>'; } ?> <center> <hr size="2" color="blue" width="50%"><br><br> <font size="4"><b>管理者認証画面</b></font> <br><br><hr size="2" color="blue" width="50%"><br><br> ユーザID/パスワードを入力してください。 <form action="login_auth.php" method="post"> <table border="2"> <tr> <td bgcolor="cyan">ユーザID</td> <td><input type="text" name="auth_id" value=""></td> </tr> <tr> <td bgcolor="cyan">パスワード</td> <td><input type="password" name="auth_pass" value=""></td> </tr> </table> <input type="submit" name="sub" value="ログイン"> </form> <a href="javascript:window.close();" target=_parent>閉じる</a> </center> </body> </html> 「auth_top.phpファイル」 <?php //セッションを開始する session_start(); //ログインが成功した証拠である変数のチェックを行なう if (!isset($_SESSION["login_name"])) { //変数に値がセットされていない場合は不正な処理とみなし、ブラウザをログイン画面へリダイレクトさせます $no_login_url ="http://{$_server["http_host"]}/reservation/login_auth.php"; header("Location: {$no_login_url}"); exit; } ?> 管理者画面です。 この簡単なプログラムなんですが、IDとPASSを入力しても画面が切り替わりません。 今、そこで行き詰っています。 どなたか教えていただけないでしょうか??

    • 締切済み
    • PHP
  • 一つのphpファイルでログイン画面を作りたい

    一つのphpファイルでログイン画面を作りたい 一つのphpファイルでログイン画面→管理者画面 ログインエラー画面を作りたいと思っております。 下記のスクリプトで上手くセッションが保持できないので、 どなたかご教授ください。 宜しくお願いいたします。 -------------------------------------------- session_start(); //パスワードチェック $error_flag = 0; if(isset($_POST["login"])){ if($_POST["id"] == $login_id && $_POST["password"] == $login_pass){ $_SESSION["login"]["admin"] = 1; }else{ $error_flag = 1; } } if(isset($_SESSION["login"]["admin"]) && $_SESSION["login"]["admin"] == 1){ //管理者画面 }else{ //エラー画面 }

    • ベストアンサー
    • PHP
  • if文でisset

    isset()などを使わずに下記のように変数だけで条件を指定するとまずいですか? isset()などをつかった場合の違いはなんでしょうか? if($_SESSION['id']){ print "hoge"; }

    • ベストアンサー
    • PHP
  • 管理者がパスワードのユーザー名で管理ページへログインできるようにしたい

    管理者がパスワードのユーザー名で管理ページへログインできるようにしたいのですが、どこの部分に ユーザーIDやパスワードを設定すれば良いのかわかりません;_;(長いので所々はしょってます) どなたか教えてください。 $username=isset($_POST['username'])?$_POST['username']:""; $password=isset($_POST['password'])?$_POST['password']:""; $database_name=isset($_POST['database_name'])?$_POST['database_name']:""; $database_host=isset($_POST['database_host'])?$_POST['database_host']:"localhost"; $database_username=isset($_POST['database_username'])?$_POST['database_username']:""; $database_password=isset($_POST['database_password'])?$_POST['database_password']:""; $product_code=isset($_POST['product_code'])?$_POST['product_code']:"";      $server_path=str_replace("\\","\\\\",$server_path); } /*else if (file_get_contents("http://www.bpowerhouse.com/bph_adminpanel/pr_validate.php?code=".$product_code)!=1) { echo "<span style='color:red;'>Your product code is wrong!</span><br/>"; }*/ else { if(is_writable("includes/")){ $f=@fopen("includes/passwd.inc.php","w+"); $database_inf='<?php $DbHost = "'.$database_host.'"; // The host where the MySQL server resides $DbDatabase = "'.$database_name.'"; // The database you are going to use $DbUser = "'.$database_username.'"; // Username $DbPassword = "'.$database_password.'"; // Password $server_path= "'.$server_path.'"; ?>'; i

    • ベストアンサー
    • PHP
  • PHP ログインについて

    PHPを使い会員サイトを作っています。 遷移としては index→login→top でログインして中の各ページで、サイトロゴをクリックすればマイページトップに戻るようにしたいです。 ログイン時はPOSTでデータを受け取り、ログイン後はセッションで全ページを繋いでいます。 そののtopで困っています。 ログインしようとすると画面が真っ白になり、検証を見てもエラーは出ていませんでした。エラー表示になるよう設定しており、今までのエラーは見れていました。 session_start(); if(!isset( $_SESSION["uid"])&&(!isset( $_SESSION["pass"]))){ if(!isset ( $_POST ["uid"] )&&(!isset( $_POST["pass"]))){ header ( "Location: login.php" );} } if((isset ( $_POST ["uid"] ))&&(isset( $_POST["pass"]))){ login(); exit; } 上記で$_SESSIONのuidとpassがなければ$_POSTのuidとpassをチェック。$_POSTもなければ、login画面に移動。 $_POSTが入っていたら次のIF文で、関数login()。 関数login()は下記の通りです。 function login(){   function inputCheck($uid, $pass){ $flg=0; // IDの登録チェック require("dbConnect.php");//接続 $sql = "select * from usr where uid ={$uid}" ; //echo "sql=".$sql."<br>"; $result = $dbInfo->query ( $sql ); $record = $result->fetch ( PDO::FETCH_ASSOC ); $count = $result->rowCount (); if($count<=0){ echo "このIDは存在しません<br>"; $flg=1; } if($pass<>$record["pass"]){ echo "パスワードが違います<br>"; $flg=1; // データベースの切断 $dbInfo = null; } return $flg; } // 送信データの取得 $uid = htmlspecialchars($_POST ["uid"], ENT_QUOTES); $pass = htmlspecialchars($_POST ["pass"], ENT_QUOTES); $flg=inputCheck($uid, $pass); if($flg<>0){ require("login.php"); exit; }} 関数に入れ子で関数が使えると見たので中に入れましたが、inputCheck()をlogin()の外に出してみても同じように画面が真っ白になりました。 最初にログインだけ作って動かした際にはログインすることが出来ました。 ログイン状態のチェックが悪いのか関数の使い方が悪いのか、わかりません。 ご教授いただければ幸いです。

    • ベストアンサー
    • PHP
  • プログラムの挙動が・・・

    orderform1.php→orderform2.php(form action="confirm_form2.php")→orderform3.php→complete.phpという流れの、ショッピングカート的なものを作っています。 そこで問題が起こっているのですが、 1,orderform2.php→orderform3.phpに遷移する時、入力したはずの$_SESSION['family']が表示されない。(同じ手順を踏んでいる他の$_SESSION['']は表示される) 2,orderform3.phpはいわゆる確認ページなのですが、そのページのリンクからorderform1.phpに戻り、手順に従って再びorderform2.phpにアクセスすると内容が表示されない(orderform3.phpからorderform2.phpに戻った場合は表示される) 3,テキストボックスの内容はsessionで表示させられるが、オプションボタン・チェックボックス・プルダウンメニューを入力時の状態に保持することができない(分からない) 1は恐らく、orderform2.phpかconfirm_form2.phpどちらかが原因だと思うのですが・・・ ▼confirm_form2.php session_start(); $_SESSION['error']=""; $family=$_POST['family']; $name=$_POST['name']; $huri_fami=$_POST['huri_fami']; $huri_fir=$_POST['huri_fir']; $zip=$_POST['zip']; $pref=$_POST['pref']; $add1=$_POST['add1']; $add2=$_POST['add2']; if($_POST['add3']==""){ $add3=""; }else{ $add3=$_POST['add3']; } $tel=$_POST['tel']; $email=$_POST['email']; $time=$_POST['time']; if(isset($family)){ $_SESSION['family']=$family; } if(isset($name)){ $_SESSION['name']=$name; } if(isset($huri_fami)){ $_SESSION['furi_fami']=$huri_fami; } if(isset($huri_fir)){ $_SESSION['huri_fir']=$huri_fir; } if(isset($zip)){ $_SESSION['zip']=$zip; } if(isset($pref)){ $_SESSION['pref']=$pref; } if(isset($add1)){ $_SESSION['add1']=$add1; } if(isset($add2)){ $_SESSION['add2']=$add2; } if(isset($add3)){ $_SESSION['add3']=$add3; } if(isset($tel)){ $_SESSION['tel']=$tel; } if(isset($email)){ $_SESSION['email']=$email; } if(isset($time)){ $_SESSION['time']=$time; } if($_SESSION['family']=="" && $_SESSION['name']==""){ $error.= "名字、名前が入力されていません。<br>"; }else if($_SESSION['family']==""){ $error.= "名字が入力されていません。<br>"; }else if($_SESSION['name']==""){ $error.= "名前が入力されていません。<br>"; } if($_SESSION['huri_fami']=="" && $_SESSION['huri_fir']==""){ $error.= "名字、名前のフリガナが入力されていません。<br>"; }else if($_SESSION['huri_fami']==""){ $error.= "名字のフリガナが入力されていません。<br>"; }else if($_SESSION['huri_fir']==""){ $error.= "名前のフリガナが入力されていません。<br>"; } if(!eregi('[0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9]', $_SESSION['zip'])){ $error.= "郵便番号が正しく入力されていません。<br>"; } if($_SESSION['add1']==""){ $error.= "市区町村が入力されていません。<br>"; } if($_SESSION['add2']==""){ $error.= "番地が入力されていません。<br>"; } if($_SESSION['pref']==""){ $error.= "都道府県が選択されていません。<br>"; } if(!eregi('[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]', $_SESSION['tel'])){ $error.= "電話番号が正しく入力されていません。<br>"; } if(!eregi('[a-z0-9._\-]+', $_SESSION['email'])){ $error.= "メールアドレスが正しく入力されていません。<br>"; } if($_SESSION['time']==""){ $error.= "時間帯指定が選択されていません。<br>"; } if(isset($_SESSION['error'])){ $_SESSION['error']=""; $_SESSION['error']=$error; }else{ $_SESSION['error']=$error; } header("Location: orderform2.php"); if(!$family=="" && !$name=="" && !$huri_fami=="" && !$huri_fir=="" && !$zip=="" && !$pref=="" && !$add1=="" && !$add2=="" && !$tel=="" && !$email=="" && !$time==""){ header("Location: orderform3.php"); }  長くて申し訳ないですが、少しでも分かる方、どなたか知恵をお貸しください。  他のPHPのソースは載せきれないので、補足要求があれば載せます。

    • 締切済み
    • PHP
  • php session cookie 概念

    いつもお世話になっております。 php&mysqlにて会員制サイトを作成中です。 sessionを用いて期待する動作は実現できたのですが、どうしても理解できないことがあります。 sessionについて色々と調べますと、 1)サーバーサイドで処理する方式(URIに埋め込む) 2)クライアントサイドで処理する方式(cookieに渡す) となっております。 ところが、 作成中のサイトでは、cookieを利用していないのですが、URIにも何も付加されていません。 それでも、ログイン・ログオフ状態はそれぞれ望む通りに表示されています。 これは一体どういうことなのか、お分かりになる方がいらっしゃいましたらご回答をお願い致します。 以下に大まかなコードを。 ログイン直後のページ session_start(); session_unset(); if(!isset($_SESSION["user_session"])){ session_register("user_session"); $_SESSION["user_session"]=$hoge; } その他のページ session_start(); $hoge=$_SESSION["user_session"]; if(!empty($hoge)){ echo "ログインしてません"; }else{ echo "ログインしてます"; } 以上のようなものです。 マイページはIDとパスワードで認証しており、本人以外は見ることができないのですが、その他のページはログインすれば誰でも見ることができるようになっています。 現段階で特に暗号化などの処理は施しておりませんが、セキュリティー関連は今後の作業として予定しております。 個人サイトを作り始めて半年で、色々と不勉強な部分、理解が不十分な部分がございます。 分かりやすく説明いただけると助かります。

    • ベストアンサー
    • PHP
  • output_bufferingについて

    phpでログイン認証画面システムを作成しました。 1.base.php、認証画面の表示。 2.lform.phpで、ログインフォームの呼び出し。 3.LoginUserCheck.phpで、DBに接続し、ユーザーが存在するならSESSION["flag"]に値を入力し   ページ内容の切り替え。 という内容を作りました。 ユーザーID または、パスワードを未入力で、「ログイン」ボタンを押したところ、  【ユーザーIDが入力されていません。  Warning: Cannot modify header information - headers already sent by ~~】と、 ユーザーに未入力を促すメッセージ + Warningメッセージが出るという事象が発生しました。 色々検索してみたところ、 【header関数の前に、何か出力しているとよく発生するエラー】 ということまでわかりました。 ただ、今回使用した3つのphpファイルには、【header関数は使用しておりません】。  色々対応していくと、 php.iniの【output_buffering = Off】から【output_buffering = On】に変更すると 【ユーザーIDが入力されていません。】のメッセージ出力のみで Warningメッセージ が出なくなりました。 ■質問 【output_buffering = Off】から【output_buffering = On】 にして、なぜWarningメッセージが出なくなったのでしょうか。 output_bufferingは、出力をバッファにためる? ぐらいの認識なのですが、これによる効果のものなのでしょうか。 ご教授よろしくお願いします。 =======================*base.php*ここから================= *base.php* <?php require_once("lform.php"); require_once("LoginUserCheck.php"); session_start();    if(isset($_POST['username'])){     $login = new LoginUserCheck($_POST['username'], $_POST['password']);     $login->usercheck();    }    if(!isset($_SESSION["flag"])){     //ログインできていなければログインページ表示     lform();    }else{     //ログインできていれば普通のページを表示     print("<html><head><title>セッション開始ページ</title></head><body>");     print("ログインしました<br>");     print("<a href='pageb.php'>PageBへのリンク</a>");    } ?> ====*lform.php*ここより==== <?php function lform() {     //ログインフォーム表示     print("<html><head><title>ログインページ</title></head><body>");     print("<form method='POST' action=' " . $_SERVER['PHP_SELF'] . " '> ");     print("userID:<input type='text' name='username' size='15' maxlength='20'><br>");     print("pass:<input type='password' name='password' size='15' maxlength='20'><br>");     print("<input type='submit' value='ログイン' /></form>"); } ?> ====*LoginUserCheck.php*ここより==== <?php class LoginUserCheck {  public function usercheck(){   //エラー処理   if($_POST['username']が未入力なら){    print("ユーザーIDが空白です<br>");   }   if($_POST['password']が未入力なら){    print("パスワードが空白です<br>");   }   //userとpassが入力済みなら接続し、SESSION[flag]を設定する。   if(!($_POST['username'] == "") && !($_POST['password']"")){    try {      ~DB接続し、ログインができたなら、$_SESSION["flag"]に、値を代入~    } catch (PDOException $e) {      print("接続エラーー: " . $e->getMessage());    }  } } ?> ==========================ソースここまで==============

    • ベストアンサー
    • PHP
  • var_dumpの使い方について

    よくわからない点がございますので、お知恵をお貸し頂ければ幸いでございます。 よくあるvar_dumpの使い方の例には、 <?php $a = array(1, 2, array("a", "b", "c")); var_dump($a); ?> や、session_start(); var_dump($_SESSION); if (isset($_SESSION['expire'])){ など色々ありますが、 下記スクリプトで「$_POST」「$_COOKIE」「$sql」「$record」を調べるには、var_dumpをどこに配置すれば、画面上にスクリプトが反映されるのでしょうか。 皆様お忙しいところ恐れ入りますが、ご助力頂ければ幸いです。 ■スクリプト <?php require_once('dbwin') session_start(); if (isset($_COOKIE['mail1']) !== TRUE) { $_COOKIE['mail1'] = NULL; } if ($_COOKIE['mail1'] != ''){ $_POST['mail1'] = $_COOKIE['mail1']; $_POST['password'] = $_COOKIE['password']; $_POST['save'] = 'on'; } if (!empty($_POST)) { // ログインの処理 if ($_POST['mail1'] != '' && $_POST['password'] != '') { $sql = sprintf('SELECT * FROM ○○ WHERE mail1="%s" AND password="%s"', mysql_real_escape_string($_POST['mail1']), sha1(mysql_real_escape_string($_POST['password'])) ); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { // ログイン成功 $_SESSION['id'] = $table['id']; $_SESSION['time'] = time();                                       ........省略 以上なのですが、上記スクリプトの 「$_POST」「$_COOKIE」「$sql」「$record」を、var_dumpを使って調べたいのですが、 その手法を具体的にご教授願えますでしょうか。 例えば、「$record」であれば、 $record = mysql_query($sql) or die(mysql_error()); $var_dump($record); とすべき。  ⇒という形でお知恵をお貸し頂ければ幸いでございます。 (この場合実際には、画面にvar_dumpで得られた値は表示されませんでした。) みなさまお忙しいとは存じますが、何卒よろしくお願い申し上げます。

    • ベストアンサー
    • PHP

専門家に質問してみよう