2011-05-20 50 views
3

我已經在我的系統中配置了wamp,並在本地環境中進行開發和測試。我正在研究註銷功能,並且碰巧注意到在瀏覽器中生成的會話id相同。爲什麼php每次在測試環境(WAMP)中生成相同的會話ID?

例如,即使在註銷並登錄後,所有用戶的chrome始終生成會話id = abc; IE始終爲所有用戶生成會話ID = xyz。

這是wamp /我的測試環境的問題嗎?

請看下面我註銷PHP腳本 -

<?php 
session_start(); 
$sessionid = session_id(); 
echo $sessionid; 
session_unset(); 
session_destroy(); 
?> 
+0

這是代碼我有它在我的應用程序和它的作品!希望它解決了某人的問題。 ** <?php session_start(); session_regenerate_id(TRUE); //重新生成會話ID session_destroy(); ?> ** – 2012-11-29 04:57:14

回答

7

你可能仍然有舊的會話ID的Cookie,以它既不session_unset也不session_destroy刪除該cookie:

爲了完全終止會話,想註銷用戶,會話ID也必須取消設置。如果使用cookie傳播會話標識(默認行爲),則必須刪除會話cookie。 setcookie()可用於此。

所以使用setcookie註銷後的會話ID cookie無效:

if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

另一項建議是再生利用session_regenerate_id(true)認證成功後,會話ID。

+0

是的,餅乾是問題。我認爲會話默認情況下會使用服務器文件機制,而不是cookie,所以我並不擔心清除cookie。 感謝代碼太..作品像魅力! – 2011-05-20 18:54:29

+0

@arun:PHP的默認會話存儲是文件。該cookie僅用於傳輸用於識別存儲器中會話數據的會話ID。 – Gumbo 2011-05-20 18:56:47

2

必須使用功能session_regenerate_id()重新生成會話ID。沒有這一點,會話ID將在頁面刷新之間相同。

2

session_destroy()銷燬所有與當前會話相關的數據。它不會取消設置與會話關聯的任何全局變量,也不會取消設置會話Cookie。要再次使用會話變量,必須調用session_start()。

爲了完全消滅會話,就像登錄用戶一樣,會話ID也必須取消設置。如果使用cookie傳播會話標識(默認行爲),則必須刪除會話cookie。 setcookie()可用於此目的。

http://php.net/manual/en/function.session-destroy.php

+0

我哪裏錯了? 我已經使用註銷腳本取消設置所有會話變量,並且它也銷燬會話。因此,如果使用相同的瀏覽器,如果進行了不同的登錄,爲什麼仍然使用與以前的用戶相同的會話ID? 我參考了php.net,它說 - 「session_unset()函數釋放當前註冊的所有會話變量。」 – 2011-05-20 18:42:49

+0

在session_destroy()之前拋出一個session_regenerate_id()在那裏,你應該得到一個新的ID? – Jasoon 2011-05-20 18:45:09

+0

session_unset()將取消設置會話變量,不會結束會話。它使得$ _SESSION ['whatever']在會話中不存在,但是仍然可以將變量設置到會話中並繼續使用它。 Session_destroy實際上會將服務器上的會話文件從服務器上刪除,所以在下一次加載時沒有數據供會話查找。 – 2011-05-20 18:45:48

1

session_unset()session_destroy()採取不刪除會話cookie。您必須通過撥打setcookie()來手動取消設置。

session_unset是session_register()的反義詞,session_destroy只是在不影響cookie的情況下清除$ _SESSION。

1

manual(session_destroy):

session_destroy(),刪除所有與當前 會話相關聯的 數據。它不會取消設置任何與 會話相關的全局變量,也不會取消設置會話Cookie。 要再次使用會話變量,必須調用 session_start()。

爲了完全消除會話 ,就像登錄用戶一樣, 會話ID也必須取消設置。如果 使用cookie來傳播會話ID(默認行爲),然後使用 ,則必須刪除會話Cookie。 setcookie()可用於此。

除非您特別取消設置cookie,否則cookie將仍然存在,並且下一次調用session_start()時,它將使用它作爲會話ID。關閉瀏覽器也應該清除cookie,因爲它們通常由php設置爲在瀏覽器關閉時過期。

3

會工作。請試試這個

session_start(); 
session_regenerate_id(TRUE); 
session_destroy(); 
0

要停止會話劫持遵循下面的代碼在PHP

session_start(); 

    /* to stop session hijacking */ 

    // Generate new session without destroying the old one 
    session_regenerate_id(false); 

    // Fetch current session ID and close both sessions to allow other scripts to use them 
    $newSession = session_id(); 
    session_write_close(); 

    // Assign session ID to the new one, and start it back up again 
    session_id($newSession); 

    session_start(); 
相關問題