2016-08-03 2 views
0

지금 세션에 문제가 있습니다. 스크립트에서 로그인을 사용하여 초기 인증을 한 다음 각 보호 된 페이지의 시작 부분에서 인증하고 마지막으로 (아래 코드)을 시도해보십시오.브라우저를 다시 시작한 후에도 세션이 종료됩니다.

파일은 PHP 5.6을 사용하여 내 서버에 있습니다. 내 PC에서 Win10과 Chrome을 사용하고 있습니다.

현상 : 세션 바르가 파괴되어 있지만

  1. , 난 아직 인증을 수행하는 페이지를 보려면 브라우저의 '뒤로'버튼을 사용할 수 있습니다. 그 페이지에 $ _SESSION vars를 덤프하면 (브라우저의 뒤로 버튼을 사용하여 다시 탐색했을 때) $ _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; 

을 인증 코드 보호 된 각 페이지

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