[英]Difficulty logging user out from website
編寫一個小型CMS。 用戶身份驗證是通過在命名會話中用php設置的會話變量進行的。 調用注銷時,Ajax例程會加載一個單獨的PHP腳本來完成工作。 此單獨的腳本使用相同的會話參數。 使用隨機數據分別覆蓋會話變量,然后銷毀會話。 這可行。 注銷后檢查瀏覽器cookie列表顯示會話cookie已被刪除。 到目前為止,一切正常。
如果用戶在登錄時導航到同一站點的另一個頁面,或者在新的瀏覽器選項卡中打開第二個頁面,則會出現問題。 一旦完成,注銷例程就無法破壞或取消會話設置。 更糟糕的是,即使注銷時密碼會話變量是隨機的,重新加載頁面也會將其恢復為之前的值,從而有效地將用戶重新登錄。
檢查瀏覽器數據后,發現會話cookie在發出session_destroy()時未能刪除,並且我無法以編程方式執行的任何操作將其刪除。
我試圖弄清楚為什么打開第二個站點頁面(使用相同的會話參數)似乎應該鎖定會話,以便不能從任何一個頁面中刪除它。 php手冊在任何地方都沒有建議任何此類行為。
已建議將瀏覽器緩存作為罪魁禍首,但似乎不太可能。
摔跤了一段時間。 有任何想法嗎?
測試已在Firefox版本6到最新版本中完成。
session_destroy()
不會取消設置會話cookie(或為此重置$_SESSION
全局變量); 它只會破壞服務器端會話數據存儲(默認的基於文件的會話配置中的文件)。 刪除cookie(可以使用具有空值的setcookie()
“手動”完成)來刪除會話數據不是必需的。 當session_destroy()
被調用但cookie保持不變時,在后續請求上使用session_start()
將啟動一個具有相同ID的新會話(除非您也調用session_regenerate_id()
)但沒有會話數據。
現在,關於您的問題,很難在不看代碼的情況下說出正在發生的事情,但是這里有一些想法:
使用隨機數據分別覆蓋會話變量,然后銷毀會話。
在調用session_destroy()
之前,沒有必要將會話數據設置為任何值,因為這些新值將永遠不會將其存儲到會話數據存儲中。
注銷后檢查瀏覽器cookie列表顯示會話cookie已被刪除。
就像我說的那樣,cookie不會自動刪除。 它更有可能沒有被設置。
更糟糕的是,即使注銷時密碼會話變量是隨機的,重新加載頁面也會將其恢復為之前的值
這表明session_destroy()
實際上並沒有破壞任何東西。 令我感到懷疑的是,在注銷腳本中,您沒有在試圖銷毀會話之前初始化會話(使用session_start()
)。 這將導致PHP警告,您可能看不到該警告,因為您已禁止警告,或者因為腳本是通過AJAX調用的。
另一種可能性較小的可能性是,注銷腳本確實會啟動然后破壞會話,但這是一個完全不同的會話。 使用Firebug或類似工具查看會話Cookie是否隨AJAX請求一起發送。
最后,就像有人已經提到的那樣:如果需要將密碼存儲在會話變量中,則可能需要重新考慮整個身份驗證機制,但這是一個完全不同的主題。
MarcB有答案-必須在銷毀會話之前發出session_write_close()。
在ajax注銷例程中使用此選項,從任何頁面注銷都將按原樣取消用戶在所有打開的頁面上的編輯權限。
謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.