2010-02-01 102 views
20

在CodeIgniter中,會話數據默認保存在cookie中。但是我的服務器上還必須有一個文件(命名爲會話ID)來驗證數據(在cookie中)是否有效,或者我錯了嗎?CodeIgniter如何知道cookie保存有效會話數據?

我正在搜索保存會話的位置。我已經查看過「session.save_path」目錄(/ var/lib/php5),但是在這個目錄中只有其他會話,而不是CodeIgniter會話。

我不會將會話保存在數據庫中,那麼CodeIgniter如何知道數據(在Cookie中)是有效的?

回答

5

該cookie包含會話數據的)MD5哈希和其在加載數據被驗證cookie的加密密鑰,見系統/庫/ session.php文件,功能sess_read(線140ff:

// Decrypt the cookie data 
if ($this->sess_encrypt_cookie == TRUE) 
{ 
    $session = $this->CI->encrypt->decode($session); 
} 
else 
{ 
    // encryption was not used, so we need to check the md5 hash 
    $hash = substr($session, strlen($session)-32); // get last 32 chars 
    $session = substr($session, 0, strlen($session)-32); 
    // Does the md5 hash match? This is to prevent manipulation of session data in userspace 
    if ($hash !== md5($session.$this->encryption_key)) 
    { 
     log_message('error', 'The session cookie data did not match what was expected. This could be a possible hacking attempt.'); 
     $this->sess_destroy(); 
     return FALSE; 
    } 
} 
+0

將數據存儲在加密的cookie中是一種方法。沒有理由浪費會話上的I/O資源。 – Xeoncross 2011-11-10 22:16:36

10

本機codeigniter安裝覆蓋常規的PHP會話處理,並使用他們自己的數據處理系統,這是您無法在正常位置找到它的原因。 (另外我會提到,我個人發現它的實現方式有點不安全,因爲所有會話數據都直接存儲在用戶瀏覽器會話cookie中。)

您可以按照Residuum建議的方式進行操作,並通過codeigniter會話庫並查找它的存儲位置,或者可以使用OB_Session之類的內容覆蓋會話處理。 (http://bleakview.orgfree.com/obsession/

我強烈建議您安裝OB_Session或類似的東西,因爲它會使用本機PHP會話處理,它會保持您的Cookie不是A)變得太大,並且崩潰在瀏覽器字節限制,或B)允許敏感的用戶數據存儲在客戶端。

最後,根據您要做的事情,我會遵循CI用戶指南的說明並將會話數據存儲在數據庫中。 (http://codeigniter.com/user_guide/libraries/sessions.html)這將使您更輕鬆地處理數據,甚至更新和擴展Codeigniter存儲的內容。請記住,即使將其存儲在數據庫中,您仍然必須更改爲類似OB_Session的內容,因爲即使更改爲數據庫,cookie仍保留所有數據。

+1

「請記住,即使您將其存儲在數據庫中,您仍然必須更改爲類似OB_Session的內容,因爲即使更改爲數據庫,您的Cookie仍保留所有數據。」 - 我有理由相信這是不正確的。 CI會啓用時將會話數據而不是會話ID放入數據庫中,而不是在Cookie中。那麼,至少在1.7.2。 – Ferdy 2010-02-11 14:24:30

+0

任何人都可以驗證Ferdy的以上評論嗎? – Ash 2011-01-21 15:55:30

+0

在Firefox中安裝'Web Developer Toolkit'插件,您將可以直接查看創建的Cookie(使用Cookie下拉菜單)。你可以自己檢查一下。我知道這個事實發生在1.7.1,當我轉移到OB_Session時,我懷疑他們重寫了他們的會話類的整個工作方式爲1.7.2。阿什利,我建議你自己檢查一下,以防萬一我們中的任何一個人出錯,但是我知道一年前之前它就引起了我足夠的關注,以徹底拋棄本地的CI解決方案。祝你好運! – Shane 2011-01-25 16:25:48

5

這不是直接回答你的問題,但我認爲這可能是有用的知道。

使用以下命令查看PHP會話。

print_r ($_SESSION); 

使用以下命令查看CI會話。

print_r ($this->session->userdata); 
3

今天這個只是測試用螢火蟲..

要跟進Shanee的回答,CI中的 「應用程序/配置/ config.php文件」 的文件,如果一個集:

$config['sess_use_database'] = TRUE; 

那麼只有默認的CI會話數據:session_id,IP_address ..被存儲爲瀏覽器cookie。

set_userdata()函數提供的任何其他自定義數據(如用戶名和密碼)不再是cookie的一部分,而是存儲在數據庫中。

+0

同樣的問題在這裏,據我所知,這隻發生在localhost上。 – RaduM 2012-02-08 19:31:58

0

當我說下面的「會話」時,我的意思是CI會話,而不是PHP會話。

如果使用默認選項(該手冊說不應被用於敏感數據),然後回答你的問題是,它不知道。它信任cookie。

要以設計的安全方式使用它,您應該使用數據庫會話選項以及加密選項。使用這兩個選項,這是您的問題的答案:

只有一個值存儲在cookie中。該值是一個序列化和加密的數組。該數組包含四條信息。

  • 'SESSION_ID',=>隨機散列
  • 'IP_ADDRESS'=> '串 - 用戶IP地址'
  • 'USER_AGENT'=> '串 - 用戶代理數據'
  • 'last_activity' =>時間戳

會話ID是一個隨機字符串。這是用於與會話表中的數據關聯的字符串。該字符串會重新生成(並重新加密)每個請求並在cookie和表中進行更新。如果這與會話表值不匹配,則表數據將無法訪問,並將被捕獲到內置垃圾回收中。

(可選)您也可以在CI會話類中強制執行IP檢查。這意味着,除了隨機重新生成會話ID之外,他們的用戶IP還必須保持一致,否則會話將被銷燬。

(可選)也可以強制執行UA檢查和超時值。

因此,傳統會話文件永遠不會寫入緩存文件夾中。 CI Cookie會話對於除個人數據之外的所有數據都是毫無價值的,例如記住Web界面的UI狀態。 CI數據庫會話非常靈活。如果您的PHP安裝包含Mcrypt,則安全性也很強大。如果你沒有Mcrypt,他們仍然是相當安全的,但不會通過,例如PCI合規。

你可以閱讀更多的CI manual,但是這是我認爲最相關的問題的信息的摘要。