2012-03-22 51 views
0

我想知道當用戶登錄網站時有或沒有檢查「保持登錄狀態」複選框時發生了什麼。 根據我的理解,start_session在服務器上創建一個變量,並將會話ID存儲在客戶端的瀏覽器中的一個cookie中,關閉該瀏覽器時會被銷燬。 按照這種推理,我想,勾選「保持登錄狀態」複選框以N秒,這將通過設置可以實現推回有效期限:php如何「保持登錄狀態」複選框影響日誌記錄過程?

setcookie(session_name(), session_id(), time()+N); 

在這種情況下,我認爲沒有必要使用cookies至少在日誌過程中是這樣。 我是對的還是錯的? :)

+0

它會創建一個到期的cookie,它將來會到期並且不會過期。 – Joseph 2012-03-22 23:17:41

+0

一些會話僅用於一個會話,而cookies +會話保留在 – 2012-03-22 23:17:44

+0

即使關閉瀏覽器後,使用PHPSESSID保持登錄狀態的唯一缺點是服務器會將會話變量保留在內存中作爲垃圾收集器只會刪除X天以前的變量,X優於用戶連接之間的天數。這是對的嗎? – caccialdo 2012-03-22 23:24:31

回答

1

我寫這樣一個選項的方式是創建一個令牌並將其與用戶ID一起存儲在數據庫中。然後,我將該令牌作爲cookie提供給瀏覽器。任何時候一個頁面請求完成後,我會先檢查用戶是否有活動會話,然後是否有這個令牌cookie。如果他們有一個令牌cookie,我會查看數據庫以查看它是否有效,如果有,請使用該用戶ID創建一個會話。

但我確定這是一個不安全的,容易被破壞的方法。

+0

你的意思是IF($ _ SESSION):「確定在數據庫中記錄用戶:ELSE:」檢查令牌,以防止用戶關閉他的瀏覽器。「我想避免檢查每個支票的數據庫,你認爲這是否安全將標記存儲在$ _SESSION中?這意味着:如果DB中的標記與cookie中的標記相匹配,那麼將標記存儲在會話中 – caccialdo 2012-03-22 23:37:27

+0

只有在數據庫沒有有效會話時纔會檢查數據庫記住,在這種情況下, 「session」表示$ _SESSION superglobal,第一個檢查是看他們是否有一個有效的$ _SESSION指示他們的用戶ID,如果他們沒有,它檢查是否存在$ _COOKIE ['token'],只有在這種情況下(每個瀏覽會話每用戶幾乎一次)數據庫被檢查 – kingcoyote 2012-03-22 23:40:10

+0

我在考慮你的解決方案如果令牌基於隨機字符串並在每個用戶/密碼登錄後計算,那麼只有一臺計算機可以同時登錄。這可以避免,但可能不太安全如果不是使用隨機字符串,而是使用祕密字符串。也許這就是谷歌用來「註銷所有其他會話」的內容。他們存儲一個隨機的祕密字符串與用戶相關聯,只有當「註銷所有其他會話」被選中時纔會被更改... – caccialdo 2012-03-22 23:59:02

2

有一對夫婦的典型方式是「保持登錄狀態」框可能被處理......

  • 你可以設置一個永久性的Cookie用戶的信息,並查找該cookie。
  • 你可以創建一些唯一的ID(最好是一個很大的...就像一個GUID或一個哈希),將它存儲在一個永久性的cookie中,並讓它充當auth信息。

請注意,大多數解決方案實際上並不涉及用戶入住登錄;他們只是讓用戶看不到另一個密碼提示。使會話保持活動狀態並將會話ID存儲在持久cookie中在技術上是可行的,但對於擁有大量用戶的站點而言,這會佔用相當多的空間並加載到服務器上。