2009-11-05 66 views
5

我試圖爲我的PHP應用程序創建一個身份驗證機制,我很難破壞會話。我已經試過你重置這是以前的會話陣列內設置身份驗證令牌,並通過PHP會話並沒有破壞用戶註銷

session_destroy破壞會議,

以及銷燬會話之前完全復位會話陣列。我正在調用頭函數並返回到函數調用結束時的index.php頁面。我也試着

session_write_close

處理關閉會話。當我登錄用戶時,我做了會話的vardump,它沒有顯示任何數據,但是當我回到index.php頁面時,我收回了用戶驗證數據。我也做了Post數據的vardump,以確保我不會以某種方式重新提交後驗證處理程序。

關於在這裏做什麼的任何建議?

+0

您不必使用session_write_close()..通常用於用戶身份驗證。 – mauris 2009-11-05 22:46:48

回答

6

首先,確保你打電話session_start();之前致電session_destroy();因爲它只會發出警告,如果你不這樣做。

此外,從PHP: session_destroy

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

+1不在logout.php頁面上調用session_start。 – jkushner 2009-11-06 20:59:20

+0

如果您使用了命名會話,請不要忘記使用session_name! – Calmarius 2011-09-28 14:27:06

0

我會檢查什麼是使用招,並檢查哪些信息你已存儲在您的session.save_path

0

確定的頁面沒有被緩存發送瀏覽器向服務器?

上書寫的身份驗證令牌:

session_start(); 
$_SESSION['varName'] = null; 
$_SESSION = array(); 
session_destroy(); 
0

但是當我回到index.php頁面

是不是特定的頁面在瀏覽器剛剛被要求緩存?做一個硬刷新的頁面(大多數網頁瀏覽器中的CTRL+F5)。

如果原來是原因,並要禁用請求緩存,添加以下套頭爲HTML <head>您的網頁:使用PHP的header()功能

<meta http-equiv="cache-control" content="no-cache,no-store,must-revalidate"> 
<meta http-equiv="pragma" content="no-cache"> 
<meta http-equiv="expires" content="0"> 

,或者在PHP代碼:

header('cache-control: no-cache,no-store,must-revalidate'); // HTTP 1.1. 
header('pragma: no-cache'); // HTTP 1.0. 
header('expires: 0'); // Proxies. 

不要忘記在測試前先清除瀏覽器緩存:)

2

也值得關注PHP會話,session_unset()>​​; 我不知道爲什麼。在閱讀PHP Manual entry on session_destroy()之後,它似乎只刪除當前上下文中的數據,實際上並沒有將它從平面會話文件中清除,所以如果您沒有清除cookie,則可以馬上恢復。這看起來非常違反直覺(正如PHP一般),並且可能是幾年前我決定(並且很快忘記原因)的原因,總是使用session_unset()而不是​​。

此外,請確保您的重定向發生在您完成所有此會話廢話之後,因爲PHP的行爲並非所有開發人員所期望的。最佳做法,國際海事組織,是每header('Location: ...');呼叫die;

1

如果你只使用session_unset()然後小車IE仍然保留數據我的建議是使用兩個。