2016-08-03 9 views
0

私は今セッションで問題が発生しています。スクリプトのログインを使用して初期認証を行い、保護された各ページの先頭で認証し、最後にをログアウト(下記のコード)してみてください。ブラウザを再起動してもセッションが終了する

ファイルはPHP 5.6を使用して私のサーバ上に存在します。私は自分のPC上でWin10とChromeを使用しています。

現象:

  1. セッションVARSが破壊されていますが、私はまだ認証を行うページを表示するために、私のブラウザで「戻る」ボタンを使用することができます。そのページに$ _SESSION変数をダンプすると(ブラウザの戻るボタンを使ってブラウズした)、$ _SESSION varはすべて存在しませんが、ページはまだロードされます。

  2. クッキーはまだあります。私はテストのために1(1秒)に私のPHP iniでクッキーの生涯を設定している...彼らはおそらく私はそれらを削除した後にまだあります。 0に設定されていても、ブラウザを再起動してもそれらはまだそこにあります。

  3. 上記の症状1を読んだ後で、セッションがまだ生きていることを正しく想像してくれると思います。ブラウザを閉じてから再起動し、保護されたページのURLを直接入力してくださいアドレスバーには、認証をチェックする$ _SESSION varが存在しないにもかかわらず、まだページを見ることができます。

本当に助言に感謝します。 require_onceを使用して呼び出さ

//this page is called (using require_once) by the page 
    //that captures username and password 
    session_start(); 

    //requirements 
    require_once "../php/path.php";  //sets the server search path 
    require_once "constants.php";   //does all the DEFINE stuff 
    require_once HTML_HEADER;    //loads HTML code - doc type, head etc 
    require_once DATABASE;    //does the dB connecting 

    //collect the POST 
    $uName = $_POST[uName]; 
    $uPsswd = $_POST[uPsswd]; 

    //build & execute sql query 
    **SQL to retreive uName and password here if match then...** 
     $_SESSION['approved'] = 'true'; 
     require_once MAIN_CONTENTS; //main page after authentic log in 
     exit; 

AUTHENTICATEのCODE保護された各ページ

if (session_status() == PHP_SESSION_NONE) { 
    session_start(); 
    }//end if 

    //what's the time Mr Wolf?!!! 
    $now = time(); 

    //although session exists, are we logged in and approved? If not kill session & eixt. 
    if (isset($_SESSION['approved']) && $_SESSION['approved'] != 'true'){ 
    require_once "killSession.php"; 
    require_once "notAuthorised.php"; 
    exit; 
    }//end if 

    if (!isset($_SESSION['approved'])){ 
    require_once "killSession.php"; 
    require_once "notAuthorised.php";  
    exit; 
    } 

    //if session exists, how old is it? If older than 'discard_after' then kill session. 
    if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) { 
    require_once "killSession.php"; 
    require_once "notAuthorised.php";  
    exit; 

    }//end if 
    else { 
    //logged in and approved so set timeout for 15 mins 
    $_SESSION['discard_after'] = $now + 30; 
    }//end else 

あなたの問題はおそらくPOSTデータによって引き起こされる

//check to make sure session exists - start if not 
    if (session_status() == PHP_SESSION_NONE) { 
    session_start(); 
    $_SESSION['approved']='false'; 
    }//end if 


    //following code caused 'headers already sent...' 
    //if (isset($_COOKIE[session_name()])) { 
    //$params = session_get_cookie_params(); 
    //setcookie(session_name(),'',time() - 172800, '/', $params['domain'], $params['secure'], isset($params['httponly'])); 
    //} 

session_unset(); 
session_destroy(); 
session_write_close(); 
setcookie(session_name(),'',0,'/'); 
session_regenerate_id(true); 
?> 

答えて

0

killSessionファイルによってスクリプト内

LOGまだあなたのブラウザに保存されています。戻るボタンをクリックすると、ユーザーが再度認証され、セッションが作成されます。

この問題を解決するには、POST-Redirect-GETメソッドを使用できます。

<?php 

// Has the session been set? 
if (!isset($_SESSION)) { 
    session_start(); 
} 

// If a form is submitted, add the POSt data to a session 
// and redirect 
if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    $_SESSION['login_data'] = $_POST; 
    unset($_POST); 
    header("Location: ".$_SERVER['PHP_SELF']); 
    exit; 
} 

// Check if user wants to login, authenticate and unset login data 
if (isset($_SESSION['login_data'])) { 
    // Authenticate 
    unset($_SESSION['login_data']); 
} 
?> 

<form action="" method="POST" role="form" action="<?= $_SERVER['PHP_SELF']; ?>"> 

    <label for="username">Username</label> 
    <input type="text" class="form-control" id="username" placeholder="Username" 

    <label for="password">Password</label> 
    <input type="password" class="form-control" id="password" placeholder="Password"> 

    <button type="submit" class="btn btn-primary">Authenticate</button> 
</form> 
+0

この問題を解決していただきありがとうございます。あなたのコードは私の問題を解決しませんでしたが、BROWSER CACHEに関するあなたのコメントはSPOT ONでした!だから、私はと 'header()'を使ってページキャッシュを無効にしています。 – noowie

関連する問題