我现在正在讨论会话问题。我使用登录脚本进行初始身份验证,然后在每个受保护页面的开头进行身份验证,最后我尝试注销(下面的代码)。
使用PHP 5.6在我的服务器上存在这些文件。我在电脑上使用Win10和Chrome。
症状:
虽然会话变量被销毁,我仍然可以使用' back'我的浏览器中的按钮,用于查看进行身份验证的页面。当我在该页面上转储$ _SESSION变量时(我浏览回到使用浏览器的后退按钮)所有$ _SESSION var都不存在 - 但页面仍然加载。
COOKIES仍在那里。我已经将我的php ini中的cookie生命周期设置为1(一秒)进行测试......在我认为删除它们之后它们仍然存在。即使设置为0,重新启动浏览器后它们仍然存在。
在阅读上面的症状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
杀戮文件
//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 :(得分: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>