簡體   English   中英

PHP 重新生成 session ID 登錄/退出無效

[英]PHP Regenerating session ID on login / out not working

我無法讓 PHP 的session_regenerate_id()在我正在開發的應用程序中工作。 該應用程序使用(松散的)自制 MVC 框架,並通過index.php文件使用.htaccess重定向所有請求。

我正在嘗試在注銷時重新生成 session ID,但它無法正常工作。

這是我注銷 controller 中的一些代碼 - expired 變量是對 session 超時的檢查:

    session_regenerate_id(true);        
    if(isset($_SESSION['expired']))
    {
        $this->registry->template->expired = true;
    }

    session_unset();
    session_destroy();

同樣相關的是 index.php 文件開頭的代碼:

    session_cache_expire(20);
    session_start();
    session_name("TMU");
    //session_regenerate_id();

我在每個頁面的底部回顯session_id()的結果,以查看它包含的內容以測試它是否已重新生成。

但是,當您注銷時,session ID 不會更改。 當您再次登錄時(即使使用另一個帳戶),session ID 是相同的。

您會注意到 index.php 文件中被注釋掉的第四行 - 如果我取消注釋該行,則 ID 似乎會在每個頁面上重新生成。 但是,當我再次注釋掉該行時,session ID 再次成為我在索引文件中取消注釋該行之前的原始 ID...

我只是想知道如何讓ession_regenerate_id()工作。 似乎它只是沒有“提交”更改后的 ID。 我試過使用session_commit()但我不明白它是如何完全工作的,當我試圖銷毀 session 時它給我一個錯誤。

PHP 5.3.10 和 apache 2.2.21

在多次重溫這個話題之后,我已經弄明白了。 有兩個問題。

  1. 必須在顯示任何 HTML output 和/或發送標頭之前調用session_regenerate_id() (它需要作為第一個函數調用,就像session_start()一樣)。
  2. 訂單很重要。 需要在session_start()之前調用session_name("TMU")以獲得所需的結果——我之前沒有注意到這一點。

基本上發生在我身上的是在session_start()導致它設置兩個 session ID cookies 之后調用session_name("TMU") - 兩個會話 - 一個名為 TMU,另一個只是默認的 PHPSESSID。 更改順序解決了我所有的問題並重新生成 ID/銷毀舊的 session 現在按預期工作。

對於執行此操作時遇到問題的任何人,我建議您回顯 $_SESSION 和 $_COOKIE arrays 以查看您的特定應用程序中發生了什么。

暫無
暫無

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

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