2010-03-30 58 views
2

我想了解PHP應用程式如何檢查,以查看用戶是否登錄。我專門找在MediaWiki的代碼,試圖幫助我理解,但這些情況應該在所有的PHP應用相當普遍。會話超時後,php應用如何識別用戶?

從我所收集的主要情況是:

  1. 用戶只需登錄或創建,他們每次訪問的頁面PHP知道通過檢查常見到$ _SESSION變量數據的他們, cookie。

  2. 用戶有一個很久以前的「記住我」選項登錄頁面上選中。他們在那裏有一個cookie的計算機與tokenID,這是與服務器上的一個令牌進行檢查,以驗證它們。在這種情況下,沒有會話變量,因爲訪問之間的時間可能是幾周。

我的問題是,當用戶登錄時會發生什麼,但PHP會話超時並且他想訪問一個頁面?我會假設服務器沒有簡單的方法知道這個人是誰 - 而且他們必須重定向到登錄頁面。

然而,鏈接到MediaWiki做到了這一點。我已經驗證會話文件在X分鐘後被刪除,但是當我在mediawiki中進行刷新時,它會知道我是哪個用戶,並且cookie中不包含「token」變量。

回答

0

粘粘的問題。那麼,大多數「記住我」功能是通過使用cookie來實現的,它存儲了一個驗證用戶的「令牌」。

如果不這樣做,並沒有cookie被髮送到服務器,唯一可行的辦法是,服務器被「猜測」,這是你根據參數的序列。這些參數可能包括:IP,用戶代理字符串等......但這可能在很多情況下都有效,但由於它代表安全風險,因此它不被認爲是最佳實踐。防爆。許多用戶正在共享網絡,代理服務器等......這可能會在最糟的情況下讓用戶登錄到某個elses帳戶。

1

答案是cookies。當會話過期時,除了瀏覽器發送的內容外,服務器無法識別用戶。那麼應用程序會使用cookie數據來透明地重建會話。如果cookie已過期或被刪除,那麼重定向到登錄頁面實際上是唯一的選擇。

+0

還要注意的是cookie可能只有被保存在內存中,而不是保存到磁盤,所以你不一定會看到cookie文件中的令牌。在這種情況下,會話可以通過內存中的cookie重新創建,但是如果瀏覽器關閉,cookie數據將丟失,用戶將重定向到登錄頁面。 – 2010-03-30 18:22:03

4

如果您不想再直接到當會話過期的登錄頁面,當用戶登錄(選中「記住我」的東西)一個已經創建的cookie絕包含足夠的信息來重新創建會話

並重新創建一個會話意味着重新登錄用戶。

這意味着該Cookie必須包含足夠的數據來識別用戶。


當然,你不能存儲在cookie登錄+密碼,至少在純明文,餅乾經過與每個HTTP請求的網絡;不會很安全。

但你必須找到一種方法來存儲...足夠的數據;比如登錄,可能還有一些可以用來確定用戶是否真的在cookie中登錄的用戶的散列。

這裏有一對夫婦的問題+答案可能是有趣,有關:

+0

只要擴展一下,就可以將散列存儲在數據庫的'users'表中,就像從隨機數中產生'lastLoginHash'一樣。當他們返回時,您會檢查cookie中的用戶名和散列。如果它們匹配,則登錄它們,否則重定向它們。 – Tarka 2010-03-30 18:21:08