2011-12-15 83 views
6

我設置了一個使用會話處理用戶登錄的PHP編碼網站的測試版本。在測試服務器上,會話將在瀏覽器關閉時過期,因爲將所有內容複製到「乾淨」活動服務器,會話在瀏覽器關閉時保持原位,用戶在完全重新引導系統後的第二天仍然保持登錄狀態。session.cookie_lifetime = 0時,爲什麼會話在瀏覽器關閉時不會過期?

在php.ini

; Lifetime in seconds of cookie or, if 0, until browser is restarted. 
; http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime 
session.cookie_lifetime = 0

這意味着它應重新啓動瀏覽器到期。

我想,也許它被覆蓋的地方,但如果我的print_r的session_get_cookie_params在PHP中,我得到

Array 
(
    [lifetime] => 0 
    [path] =>/
    [domain] => 
    [secure] => 
    [httponly] => 
) 

有什麼我失蹤?

+0

你嘗試在其他瀏覽器?你使用的是什麼瀏覽器?到期值可能會發送到瀏覽器,但瀏覽器可能會拒絕在關閉時刪除cookie。檢查您的瀏覽器設置,並在其他瀏覽器上測試。 – mauris 2011-12-15 10:08:24

+0

在Firefox和IE中是一樣的。當然,如果這是一個瀏覽器問題,測試服務器上也會出現這種情況。這種行爲不會發生在其他網站上(我已經注意到了) – 2011-12-15 10:12:32

+0

此外,客戶已經注意到網站是爲其構建的,他不希望它發生! – 2011-12-15 10:13:30

回答

3

我要補充說,這個是亞歷山大的出色答卷評論,但它會得到一個有點冗長。

cookie在瀏覽器上保留多久,服務器保留會話數據多長時間在沒有請求的情況下是2個獨立和獨立的事情。由於HTTP的無狀態特性,無法避免這種情況 - 儘管您可以採取一些措施來緩解您認爲的安全漏洞。

爲了讓瀏覽器在關閉和延遲後訪問同一會話,它要求瀏覽器(亞歷山大已經解釋過)保留會話cookie ,以便服務器保留會話數據。

您描述的行爲可能在處理少量請求的系統上更明顯,而會話處理程序不會驗證sesion數據的TTL(我不確定默認處理程序是否執行,或者它們是否它們只是假定任何未刪除的會話數據都被認爲是最新的)。

你沒有提供的2臺服務器是如何配置的任何細節,尤其是的session.gc_maxlifetime。

如果session.gc_maxlifetime在請求之間已經過期,但會話數據仍然可以訪問,這意味着會話處理程序僅僅認爲這是會話被認爲符合垃圾回收的時間(語義上,它是配置選項是)。但是,將這個值作爲TTL來處理是有力的。要解決這個問題,您可以強制垃圾收集更頻繁地運行並刪除會話數據,也可以使用會話處理程序忽略超出指定限制的會話數據。

,你看到的2個系統之間的差異可能是由於垃圾收集,甚至不同的會話處理程序的頻率不同的的session.gc_maxlifetime或差異值。

4

問題在這裏,一個Firefox有一個名爲「恢復上次會話」功能。如果有人在關閉時使用保存標籤,那麼它是一樣的。當瀏覽器恢復上次會話,那麼所有的會話cookie也將被恢復:)

所以你的會話cookie可以長生不老。你可以閱讀更多的Firefox session cookies

8

如果您正在使用谷歌瀏覽器

如果你設置「繼續在那裏我不放過」,Chrome將恢復您的瀏覽數據和會話Cookie。

甚至Facebook登錄(沒有「記住我」)會話被保留。

更多信息

google chrome setting

相關問題