2010-02-11 209 views
14

我正在嘗試正確註銷管理員用戶。這裏是我的功能:(PHP)如何正確銷燬會話cookie?

function logout() 
{ 
    $_SESSION = array(); //destroy all of the session variables 
    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_destroy(); 
} 

基本上,一旦我驗證密碼,我設置會話爲有效(只有1個用戶總數)。現在,當管理員點擊註銷時,我想銷燬當前會話,並銷燬cookie,以便他們不能僅僅使用瀏覽器中存儲的會話cookie返回管理頁面。但我的代碼不起作用。我打出註銷,我可以直接導航回管理頁面。但是,如果我刪除我的Cookie,功能是完美的。那麼這裏的Cookie刪除功能有什麼問題?

回答

6

也許你的問題不是cookie,但瀏覽器顯示你的管理頁面的緩存版本。那可能嗎?如果在您點擊F5時消失,則可能是這樣。這可以通過設置正確的cache-control標題來排序。

檢查出this SO question關於如何設置緩存的問題。問題恰恰相反(迫使瀏覽器緩存),但你會弄清楚要改變什麼來關閉緩存。

+0

好的,這是有道理的,但爲什麼我仍然能夠直接訪問管理頁面,即使我已經銷燬會議? – sepiroth 2010-02-11 02:12:29

+0

@hatorade,檢查我編輯的答案。 – 2010-02-11 02:14:00

+2

沒想到我認爲我想通了 - 我沒有在我的註銷頁面上呼叫session_start()(註銷文本鏈接到一個註銷頁面,該頁面調用了我的上述功能) – sepiroth 2010-02-11 02:15:03

8

如果你真的要覆蓋所有基地嘗試這樣做:

setcookie (session_id(), "", time() - 3600); 
session_destroy(); 
session_write_close(); 

這應該防止對PHP執行其餘的會話數據的進一步訪問。瀏覽器可能仍然顯示該cookie但是被設置$ _SESSION超級將會是空白

+15

在我看來,你應該在第一行寫'session_name()'(相當於'PHPSESSID')。 – 2013-11-29 12:58:37