簡體   English   中英

真正破壞PHP會話?

[英]Truly destroying a PHP Session?

我聽過關於此主題的不同回答,那么銷毀PHP會話的肯定方法是什么?

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

在最簡單的情況下,這是否足以真正終止用戶與服務器之間的會話?

要銷毀會話,您應該采取以下步驟:

  • 刪除會話數據
  • 使會話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();
}

PHP手冊解決了這個問題。

您需要終止會話並刪除會話cookie(如果您使用的是cookie)。

請參閱此頁面(尤其是第一個示例):

http://us2.php.net/manual/zh/function.session-destroy.php

在我使用PHP會話的一個站點中,我從未真正破壞過該會話。

問題在於,您幾乎必須調用session_start()來檢查$_SESSION變量,在這一點上,無論如何,您還是創建了另一個會話。

因此,在我的網站上,我只是確保每個頁面都稱為session_start() ,然后僅unset()會話狀態中用戶注銷時重要的那些部分。

$_SESSION = [];
@unset($_COOKIE[session_name()]);
session_destroy();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM