我听到过关于这个主题的不同反应,那么什么是破坏PHP会话的可靠方法?
session_start();
if(isset($_SESSION['foo'])) {
unset($_SESSION['foo'];
...
}
session_destroy();
在最简单的情况下,这是否足以真正终止用户和服务器之间的会话?
答案 0 :(得分:44)
要销毁会话,您应该执行以下步骤:
要做到这一点,我会用这个:
session_start();
// resets the session data for the rest of the runtime
$_SESSION = array();
// sends as Set-Cookie to invalidate the session cookie
if (isset($_COOKIE[session_name()])) {
$params = session_get_cookie_params();
setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));
}
session_destroy();
为确保会话ID无效,您应该只允许脚本启动的会话ID。因此设置一个标志并检查它是否已设置:
session_start();
if (!isset($_SESSION['CREATED'])) {
// invalidate old session data and ID
session_regenerate_id(true);
$_SESSION['CREATED'] = time();
}
此外,您可以使用此时间戳定期交换会话ID以缩短其生命周期:
if (time() - $_SESSION['CREATED'] > ini_get('session.gc_maxlifetime')) {
session_regenerate_id(true);
$_SESSION['CREATED'] = time();
}
答案 1 :(得分:1)
PHP手册解决了这个问题。
您需要终止会话并删除会话cookie(如果您使用的是cookie)。
参见本页(尤其是第一个例子):
答案 2 :(得分:0)
在我使用PHP会话的地方,我实际上从未破坏会话。
问题在于,您几乎不得不致电session_start()
来检查$_SESSION
个变量,此时,无论如何,您还创建了另一个会话。
因此,在我的网站上,我确保每个页面都被称为session_start()
,然后只是unset()
会话状态的那些部分在用户注销时很重要。
答案 3 :(得分:-1)
$_SESSION = [];
@unset($_COOKIE[session_name()]);
session_destroy();