即使重新启动浏览器也无法终止会话

Cant kill session even after restarting browser

我现在遇到会话问题。我使用登录脚本进行初始身份验证,然后在每个受保护页面的开头进行身份验证,最后我 尝试 注销(代码如下)。

这些文件存在于我使用 PHP 5.6 的服务器上。我在电脑上使用 Win10 和 Chrome。

症状:

  1. 虽然会话变量被破坏了,我仍然可以使用浏览器中的 'back' 按钮来查看进行身份验证的页面。当我在那个页面上转储 $_SESSION 变量时(我使用浏览器的后退按钮浏览回来)所有 $_SESSION 变量都不存在 - 但页面仍然加载。

  2. COOKIES 还在。我已将我的 php ini 中的 cookie 生命周期设置为 1(一秒)以进行测试...在我删除它们后它们仍然存在。即使设置为 0,它们在我重新启动浏览器后仍然存在。

  3. 阅读上面的症状 1 后,我想你们中的许多人会正确地猜到会话仍然存在并且运行良好 - 即使在我关闭浏览器后,重新启动它并键入 url 直接在地址栏中的受保护页面之一我仍然能够查看该页面,即使检查身份验证的 $_SESSION var 不存在。

非常感谢您的建议。

登录脚本

//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;

验证每个受保护页面使用 require_once 调用的代码

    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

killSession 文件

//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);
?>

您的问题很可能是由于 POST 数据仍存储在您的浏览器中所致。通过单击后退按钮,您的用户将再次通过身份验证并创建一个会话。

要解决此问题,您可以使用 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>