2012-05-30 73 views
0

我已經到處找在網絡上不工作時,和會話變量的細微之處需要澄清一些對我來說。PHP會話(使用myPajamas登錄腳本)改變網絡

我有一個網站,設置會話變量(我認爲這也將定義會話ID是什麼?不知道如何工作的一個cookie),和所有完美的作品。我在使用手機漫遊(使用wifi)時發現的情況是,只要手機切換wifi網絡,瀏覽器似乎無法再訪問該會話,直到該窗口/標籤關閉並重新打開。

從我讀過以下申請什麼,請說明對我來說:

  1. 當瀏覽器窗口關閉時,會話cookie被破壞,因此當我重新打開它,創建一個新的Cookie附到新的會話ID。從而允許會話再次正常工作?

  2. 如果網絡切換,服務器將創建一個新的會話ID,但由於瀏覽器窗口未關閉,舊的會話cookie未被銷燬,瀏覽器嘗試操作過期的會話ID(舊的會話cookie包含)?不知道如果這是真的,我已閱讀了這個荒謬的頁數,我找不到任何具體的。但這是我得到的印象。我見過這麼多的警告有關session_regenerate_id(),我對其非常緊張......

任何幫助,關於這個細節,或方法來解決這將是非常有益的。我在我束手無策......

UPDATE

我使用的是mypajamas腳本,以方便登錄。會話正常創建。但是,在查看代碼後,我找到了一個爲$_SERVER['REMOTE_ADDR']$_SERVER['HTTP_USER_AGENT']值設置會話變量的位置。然後交叉引用它們以確保它在同一IP上的相同瀏覽器上是同一用戶。這是爲了防止多源攻擊(不可能發生劫持)。問題是使用移動瀏覽器時,或動態IP的IP可以肯定會改變,認證失敗。

我無法相信我能不知道這一點,我花了幾個小時尋找關於會話ID的變化問題。

希望這可以幫助別人,在今後類似的問題。並且對所有閱讀這篇文章的人表示衷心的感謝,您在評論中的指導無疑幫助我解決了這個問題。

編輯的代碼

class.mypajamas.php

來源:

function check_ipau() { // user visits again... but is it really him? check values set above (by get_session()) 
    if($_SESSION['auth'.$this->_unique_id]['ip'] == $_SERVER['REMOTE_ADDR'] 
    && $_SESSION['auth'.$this->_unique_id]['ua'] == $_SERVER['HTTP_USER_AGENT']) { 
     // session data is correct -> user did not "change" ip-address or user agent (aka; hijack is unlikely) 
     return true; 

    } 
    else { 
     return false; 
    } 
} 

要:

function check_ipau() { // user visits again... but is it really him? check values set above (by get_session()) 
    /*if( $_SESSION['auth'.$this->_unique_id]['ip'] == $_SERVER['REMOTE_ADDR'] 
    && $_SESSION['auth'.$this->_unique_id]['ua'] == $_SERVER['HTTP_USER_AGENT']) { 
     // session data is correct -> user did not "change" ip-address or user agent (aka; hijack is unlikely) 
     */ 
     return true; 
     /* 
    } 
    else { 
     return false; 
    }*/ 
} 
+2

你使用直接PHP還是你使用框架?你當前的會話處理代碼是什麼樣的? (或者這不是你的代碼?) – Doon

+1

1.不一定。 Cookie可以設置爲生存任意時間。如果cookie被刪除,那麼會話不見了。 2.我不知道你的意思是「網絡交換」。默認情況下,PHP中的會話數據是服務器上由cookie中的id附加的小文件。物理網絡與它無關。 – Cfreak

+0

它是直接的PHP,沒有框架。我將在此處將會話創建顯示爲更新...首先讓它可讀,然後給我一兩分鐘:) – MaurerPower

回答

1

首先,會話變量實際上是cookie。

1)會話cookie有一個生命週期。如果你的代碼沒有指定生命週期,那麼該值默認爲你的php配置中的任何值。做一個phpinfo();並尋找session.cookie_lifetime,這是一個以秒爲單位的值。值爲0意味着當瀏覽器窗口關閉時cookie會過期。

2)如果您的代碼使用樣板PHP會話處理,那麼問題不太可能與用戶的IP地址更改有關。 PHP會話不存儲客戶端ips,只要你連接的應用程序在兩個網絡上都有相同的域名/公共IP,那麼你應該沒問題。 (請參閱PHP Session Cookies fail with users changing IP

可能會有一些額外的會話處理存儲客戶端的IP,但必須進行自定義編碼,而不是基於任何內置功能。

(根據您的修改,這是事實上的情況下)。

如果您正在訪問的網絡A和網絡B相同的URL,那麼沒有理由會意志更改/受網絡交換機的影響。如果您必須關閉瀏覽器窗口,並且發現會話數據不存在,那麼問題僅僅在於將會話cookie的生存期設置爲非0值。在session_start()之前放置以下行:

session_set_cookie_params(X); 

其中X是一個以秒爲單位的值,在該值之後cookie將過期。請記住,如果您在之前每 session_start()實例調用上述代碼,那麼該cookie將永遠不會過期,因爲每個頁面都會將該櫃檯提前一小時重置。

-1

會話只有服務器端。不幸的是,如果你來自不同的網絡地址,會話將無效。

如果您想要保留會話值,一個很好的做法是創建您自己的Cookie,以便您知道某人曾經被認證/擁有有效會話。然後,您首先檢查會話值是否已設置,如果不檢查該cookie。如果該cookie存在且具有良好的價值,則可以將該會話值重新設置爲cookie的值(或者像在進行身份驗證時那樣設置會話)。如果沒有會話並且沒有cookie,則該會話被假定爲不存在。