即使重新启动浏览器

时间:2016-08-03 09:16:16

标签: php session-variables session-cookies

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

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

症状:

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

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

  3. 在阅读上面的症状1之后,我想很多人会正确地猜测会话仍然活着并且很好 - 即使在我关闭浏览器之后,重新启动它并输入其中一个受保护页面的URL直接在地址栏中我仍然能够查看页面,即使检查身份验证的$ _SESSION var不存在。

  4. 真的很感激建议。

    登录脚本

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

    杀戮文件

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

1 个答案:

答案 0 :(得分:0)

您的问题很可能是由于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>