即使重新启动浏览器也无法终止会话
Cant kill session even after restarting browser
我现在遇到会话问题。我使用登录脚本进行初始身份验证,然后在每个受保护页面的开头进行身份验证,最后我 尝试 注销(代码如下)。
这些文件存在于我使用 PHP 5.6 的服务器上。我在电脑上使用 Win10 和 Chrome。
症状:
虽然会话变量被破坏了,我仍然可以使用浏览器中的 'back' 按钮来查看进行身份验证的页面。当我在那个页面上转储 $_SESSION 变量时(我使用浏览器的后退按钮浏览回来)所有 $_SESSION 变量都不存在 - 但页面仍然加载。
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
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>
我现在遇到会话问题。我使用登录脚本进行初始身份验证,然后在每个受保护页面的开头进行身份验证,最后我 尝试 注销(代码如下)。
这些文件存在于我使用 PHP 5.6 的服务器上。我在电脑上使用 Win10 和 Chrome。
症状:
虽然会话变量被破坏了,我仍然可以使用浏览器中的 'back' 按钮来查看进行身份验证的页面。当我在那个页面上转储 $_SESSION 变量时(我使用浏览器的后退按钮浏览回来)所有 $_SESSION 变量都不存在 - 但页面仍然加载。
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
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>