0

セッション設定が正しく機能しない理由を教えてください。次のように、 index.phpファイルに単純なフォームがあります。

<?php
  session_start();
   $_SESSION['uid'] = 'test';
?>

<!DOCTYPE HTML>
   <html>
   <body>
   <form method="POST" action="validate.php">
     Password: <input type="text" name="name" value="" />
    <input type="submit" value="Submit" />
   </form>
</body>
</html>

次のようなvalidate.phpファイルもあります。

<?php
  session_start();
   $err="You Have to Insert The Password to Get into Page";

   if(($_POST['name']) == $_SESSION['uid']){
      header ("Location: target.php");} 
     else{ echo $err; }
 ?>

最後に、target.phpページは次のようになります

<?php
 session_start();
?>

<!DOCTYPE HTML>
<html>
<body>
<img src="session.jpg">
</body>
</html>

今私の問題は、(..localhost/PHP/Session_3/validate.php) のようなブラウザーのアドレスバーから直接 validate.php または target.php の URL を実行すると、まだターゲットページにアクセスできることです! なぜこれが起こっているのか教えてください。これを防ぐために、より良い isset() 関数を設定するにはどうすればよいですか? お時間とコメントありがとうございます

4

5 に答える 5

1

ロードするすべてのページでセッションを確認する必要があります。

追加する

if(!isset($_SESSION['uid'])){
      header ("Location: index.php");
}

各ページで役立つ場合があります。また、ログアウトするたびにセッションを削除することを忘れないでください。

//Four Steps to close a session
//i.e. logging out

//1. Find the Session
session_start();

//2. Unset all the session variables
$_SESSION=array();

//3. Destroy the session cookie
if(isset($_COOKIE[session_name()])){
    setcookie(session_name(),'',time()-42000,'/');
}

//4. Destroy the session
session_destroy();

//redirect_to("index.php?logout=1");
于 2013-04-26T19:27:55.010 に答える
0

ブラウザを閉じて再度開くと、target.php にアクセスできます。最初はセッションやポストに価値がないから

したがって、この行は、

if(($_POST['name']) == $_SESSION['uid'])

等しい

if ( "" == "" )  //true

isset()を使用する必要があります。

validate.php

<?php
  session_start();
   $err="You Have to Insert The Password to Get into Page";

   if (isset($_POST['name']) && isset($_SESSION['uid'])) {
      if ($_POST['name'] == $_SESSION['uid']) {
          $_SESSION["logged"] = "logged";
          header ("Location: target.php");
      } else {
          echo $err; 
      }
   } else {
      header ("Location: index.php");
   }
 ?>

また、ログに記録されていない場合、直接 target.php にアクセスできないようにしたい場合は、次のようになります。

target.php

<?php
  session_start();
  if (!isset($_SESSION["logged"])) {
      //No access directly if not logged
      header ("Location: index.php");
  }
 ?>

<!DOCTYPE HTML>
<html>
<body>
<img src="session.jpg">
</body>
</html>
于 2013-04-26T19:31:51.727 に答える