2011-11-04 122 views
0

爲背景,這裏是我的情況:如何(如果可能)設置和取消設置會話變量/停止會話Cookie覆蓋?

我建立一個自託管平臺,爲一個特定的利基,以及該平臺的一部分,登錄過程,如果驗證設置用戶的會話。在每個管理頁面加載時,會話都會啓動並檢查變量$_SESSION['key']以查看是否爲真。

如果它是錯誤的,用戶會被重定向到登錄頁面,並顯示錯誤提示他們再次登錄。

的問題是,這是依賴於會話cookie被設置或不設置,因爲當會話cookie過期,並在會話開始與session_start()感檢查$_SESSION['key'],因此創建具有默認值的新會話cookie(我使用session_set_cookie_params()來改變路徑,超時等),使得無法重新登錄,因爲會話cookie不會覆蓋我所能看到的內容。

爲了解決這個問題我想過檢查$_SESSION['key'],這將創建一個5秒的會話cookie時使用類似session_set_cookie_params(5, ..)session_start()之前,因此允許重新登錄時要創建一個新的,但我我不確定這是否會起作用 - 而且我也確定必須有一種更有效的方法來設置/取消設置會話變量?

這裏是我的代碼:

啓動會話,如果驗證登錄

if($validated){ 
    session_set_cookie_params(1800, "/inst", $server_name['home']); 
    session_name("_inst"); 
    session_start(); 
    $_SESSION['key'] = true; 
} 

檢查$ _SESSION [ '關鍵']仍然是正確的

session_name("_inst"); 
session_start(); 

if(!$_SESSION['key']) { 
    header('Location: ' . $server['home'] . '/login/?error=1'); 
} 

任何答案或建議將太棒了,請問你是否需要澄清任何事情!

回答

2

只需在所有頁面上發出session_start()。這會無條件爲你創建一個會話,然後你可以檢查鑰匙的存在/ abscence:

<?php 

session_start(); 

if (!isset($_SESSSION['key'])) { // never logged in, or were logged in and got logged out 
    ... redirect to login ... 
    exit(); 
} 

if ($_SESSION['key'] != 'expected value') { // logged in, but no longer a valid login. 
    ... redirect to login ... 
    exit(); 
} 

你不應該亂用會話cookie設置的。保持默認狀態,只需檢查相關密鑰即可。如果他們不在那裏,那麼用戶沒有登錄並應該被重定向。

如果他們的會話已經過期並且PHP清理了會話文件,那麼他們已經被有效註銷,即使他們擁有一個它是有效的一個時間點會話密鑰,並且應該重定向到重新登錄。

+0

我聽到你在說什麼,但是我是否仍然需要取消密鑰設置?我希望在用戶需要重新登錄之前爲用戶提供最長的登錄時間(例如12小時)。如果我不改變默認的cookie參數,我將如何能夠做到這一點?我很抱歉,如果我沒有說清楚,我現在意識到我沒有真正提到爲什麼我使用'session_set_cookie_params()'函數。底線是,除非讓會議下降,否則我需要每12小時取消設置/設置'$ _SESSION ['key']'變量。 – Avicinnian

+0

你應該在php.ini中設置cookie生命週期,所以它在所有頁面中都是全局的,這樣所有的session_start()調用都會在適當的過期時間內創建一個新的cookie(如果需要的話)。您還必須確保PHP的會話垃圾收集器在12小時內不會啓動(還有更多。ini設置也是如此),否則你最終還是會得到有效的會話cookie,但沒有匹配的會話文件,因爲PHP已經清理了它。 –

+0

啊,我沒有意識到PHP有一個會話垃圾收集器。在這種情況下,我會簡單地使用默認值。此外,我完全不符合會話cookie背後的邏輯,我沒有想到意識到儘管您不能覆蓋它的參數,但您仍然可以更改其密鑰的值。我會接受你的回答,因爲它確實有意義,現在我已經考慮過了。 – Avicinnian