一尘不染

真正破坏PHP会话?

php

我听过关于此主题的不同回答,那么销毁PHP会话的肯定方法是什么?

session_start();
if(isset($_SESSION['foo'])) {
   unset($_SESSION['foo'];
   ...
}
session_destroy();

在最简单的情况下,这是否足以真正终止用户与服务器之间的会话?


阅读 224

收藏
2020-05-26

共1个答案

一尘不染

要销毁会话,您应该采取以下步骤:

  • 删除会话数据
  • 使会话ID无效

为此,我将使用以下代码:

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();
}
2020-05-26