2014-03-05 101 views
0

我正在構建一個Web應用程序,允許用戶登錄到數據庫後端並更新一些記錄。我不是一個專業的PHP開發人員。PHP,會話和退出瀏覽器

我剛剛注意到,打開Chrome瀏覽器後,瀏覽到最後一頁,它是在幾天前(重新啓動之間),這是網站的網頁之一,你只能登錄後訪問。我認爲這很奇怪,因爲會議應該過期了。

在每個頁面的頂部,我有:

session_start(); 

如果到後端的用戶登錄成功我這樣設置會話變量:

$_SESSION['userAuthenticated'] = TRUE; 

如果用戶點擊註銷按鈕它這樣做:

$_SESSION = array(); 
session_unset(); 
session_destroy(); 

在我的php.ini文件中我有以下設置:

session.cookie_lifetime 0 (0 for both local value and master value) 
session.gc_maxlifetime 900 (900 for both local value and master value) 

這是我的理解,會話將保持活動15分鐘,並在用戶完全退出瀏覽器時被銷燬。我剛剛測試過,我可以完全退出瀏覽器,再次打開它並訪問其中一個應該需要登錄的頁面。

難道我做錯了這裏 - 我不能總是指望用戶點擊退出按鈕,但我希​​望在會議上沒有任何工作15分鐘後,或者如果他們放棄他們的瀏覽器完全。

更新:這是我如何檢查,如果用戶已通過身份驗證:

if (!isset($_SESSION['userAuthenticated']) and $_SESSION['userAuthenticated'] !== TRUE) { 
header('Location: index.php'); 
die; 
} 
+0

'$ _SESSION = array();'不是必需的。此外,請顯示您如何檢查'$ _SESSION ['userAuthenticated']'以驗證用戶是否登錄。 – Raptor

+0

您可能正在從緩存中加載頁面。如果刷新,它是否仍顯示爲已登錄? (!isset($ _ SESSION ['userAuthenticated'])和$ _SESSION ['userAuthenticated']!== TRUE){ – Mike

+0

@Raptor - 我正在使用它來驗證用戶是否已驗證: header :index.php'); 死亡; } – user982124

回答

0

老實說,你應該使用在服務器端更直接的時間安排方案,並在會話超時不計。作爲程序員,我們必須儘可能控制。

例如:如果你使用一個數據庫,以保持用戶的登錄名和密碼(這應該與鹽,如果你是被散列),然後有歷史的表格設置(這應該是積極反正)。它跟蹤每個人何時登錄以及什麼ip(爲了將來的安全)。在這個歷史記錄中,將是第一次登錄和最後一次活動的時間戳,當用戶刷新頁面或執行任何操作時,它將刷新上次活動時間戳。任何操作都應該從檢查那個用戶名的最後一次登錄名的兩個開始,如果差距很大(你說的15分鐘)是一個自動session_unset並且在其他任何事情完成之前銷燬。

0

PHP上的會話使用Cookie類型的會話,在服務器端,會話信息不斷刪除。要設置會話生命週期,你可以在session_start前使用session_set_cookie_params功能:當整個瀏覽器處理退出

session_set_cookie_params(3600,"/"); // 3600 seconds (1 hour) OR 900 for 15 mins 
session_start(); 

瀏覽器只會破壞會話cookie。沒有可靠的方法來確定用戶是否/何時關閉了選項卡。有一個onbeforeunload處理程序可以附加到,並希望設法做一個Ajax調用服務器說標籤的關閉,但它是不可靠的。

相關問題