簡體   English   中英

反序列化PHP會話數據

[英]Unserialize PHP session data

我正在使用CodeIgniter 3.x與數據庫會話驅動程序,我想訪問BLOB類型的data cloumn。 這是我的blob數據:

__ci_last_regenerate|i:1435420891;identity|s:13:"john@doe.com ";username|s:13:"johndoe";email|s:13:"john@doe.com ";user_id|s:1:"5";old_last_login|s:10:"1435412865";

我嘗試使用unserialize($string)但沒有工作!

unserialize():偏移0處的錯誤

我如何訪問blob數據元素? 例如: $user['email']

沒有直截了當的方法...你可以使用session_decode() ,但它要求你已經有一個活動會話,這樣它就可以將解碼后的數據放入$_SESSION

但是,我必須告訴你,如果你想這樣做 - 你做錯了。 您永遠不應該訪問其他用戶的會話。 如果某些數據綁定到對擁有會話的用戶不明確的會話,則應該只在會話表中添加另一個字段並將其保存在那里。

我在這里得到了解決方案

所以我使用了會話解碼http://php.net/session_decode

session_decode('__ci_last_regenerate|i:1446535049;ci_UserID|s:1:"2";ci_UserName|s:24:"example@xyz.com";logged_in|b:1;');

因此會話解碼在正常的php會話中存儲了所有加密數據。

我可以使用以下方式訪問:

echo $_SESSION['ci_UserID'];

正如Narf所說,沒有簡單的方法可以做到這一點。

ykay; s解決方案預先假定您正在使用當前內置的會話處理程序。 這可以由應用程序隨時更改,並且無法保證PHP將保留此格式。

您的解決方案會破壞當前會話並將其替換為存儲的數據(但至少它將使用“當前”序列化方法)。

可以在運行時覆蓋序列化函數和session_函數的讀/寫操作。 只要您回讀使用與解碼相同的機制編碼的數據,您的機制就會起作用 - 但這對於長期存儲數據或在無法保證PHP安裝讀取的一致性的上下文中使用是一種糟糕的方法數據。

解決在用戶會話之外讀取會話數據問題的正確方法是使用serialize / unserialize格式:

ini_set("session.serialize_handler", 'php_serialize');

然后使用unserialize()來讀取數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM