2009-06-15 87 views
2

我遇到的應用程序是一個通用的Web應用程序...沒有什麼特別的關於它處理用戶的方式。也就是說,我在會話變量中處理用戶信息,並通過cookie管理會話。PHP用戶會話獲取'Muddled'

我的客戶有一個問題,即用戶登錄後,他們每時每刻都會看到一個不同用戶的頁面(這很容易確定,因爲用戶的姓名位於每頁的頂部)。如果他們點擊「主頁」鏈接,顯然,一切都很好。

現在就我的PHP知識而言,將這種事情混合起來需要一些努力,對吧?我無法在我們的任何開發環境中複製這個問題,就我而言,就像我說的那樣,實際上「共享」這種會話信息需要一些努力...

所以我的問題是這樣的:可能的問題是什麼?我之前每次遇到這種情況都是因爲「錯誤行爲」的代理服務器,儘管他們告訴我他們不代理這些請求。

還有什麼我可能會失蹤?任何其他可能的原因(自然這可能包括我的代碼問題)?

謝謝...

回答

2

所以事實證明,中最終結果這個情況來看,至少,是相當古怪。

事實證明,客戶正在使用手提電腦訪問應用程序,並讓電池變平。這個特定的設備然後將其時鐘重置爲2005年,當電池最終被充電時,似乎這導致瀏覽器從其緩存中讀取某些頁面。

只要設備上的時鐘設置正確,問題就消失了。

感謝所有的建議:我討厭試圖調試這些緩存類型問題。不過,我想我應該添加一些標題來嘗試停止這些手持設備緩存數據。

0

你向用戶呈現的是在他們(或取會話ID作爲參數的其他請求)的會話ID鏈接?

+0

不是故意的,沒有。我猜如果瀏覽器沒有收到cookie,那麼它會默認使用這個功能。在請求中使用會話標識會讓事情變得更好還是更糟? – Narcissus 2009-06-15 15:24:55

+0

更糟糕的是,因爲然後鏈接可以在用戶與他們的session_id之間共享,然後他們登錄到他們的帳戶。這就是我正在想的事。它可能會在你不知道的情況下(或者用戶的)某些Ajax查詢請求一個會話ID或者另類的東西。 – 2009-06-15 16:18:30

2

通過它的聲音,即使你的客戶向你保證它不是,它仍然像我的代理或緩存問題。如果可能的話,您可以在用戶字段附近生成頁面時添加類似時間戳的內容,以確保請求是最新的。

這種方式,如果頁面混亂,你有一些跡象表明,如果頁面生成較早,並通過路上的東西存儲。如果您的ajax結果被瀏覽器緩存,並且您的客戶端在同一個瀏覽器上有多個人,則不需要代理來獲取古怪的結果。

你可以解決這個問題的另一種方法是記錄來自客戶端的請求,並檢查你是否錯過了任何東西。如果你回放請求,你會得到相同的結果嗎?

你能否驗證當你以用戶A的身份登錄,並且「放錯了」會話cookie(刪除它),你還能得到你想要的信息嗎?如果是這樣,認證處理的方式可能有問題。

希望這會有所幫助!

1

您可能需要考慮進行某種會話驗證,例如在會話中存儲IP地址並在會話中的地址與當前用戶的IP不匹配時銷燬該會話。

當然,如果IP不匹配,您可以爲用戶強制新會話而不是銷燬它。我覺得像這樣將工作:

session_start(); 

if (isset($_SESSION['ip'])) { 
    if ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) { 
     session_regenerate_id(); 
     session_destroy(); 
     session_start(); 
     $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
    } 
} else { 
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
}