CodeIgniter如何知道cookie包含有效的会话数据?

Jen*_*erg 20 php cookies session codeigniter

在CodeIgniter中,会话数据默认保存在cookie中.但是我的服务器上必须还有一个文件(命名为会话ID)来验证数据(在cookie中)是否有效,或者我错了?

我正在搜索会话保存的位置.我已经查看了"session.save_path"目录(/ var/lib/php5),但是在这个目录中只有其他会话,而不是CodeIgniter会话.

我也没有在数据库中保存会话,所以CodeIgniter如何知道数据(在cookie中)是有效的?

Sha*_*ane 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仍会保留所有数据.


Res*_*uum 5

cookie包含会话数据的md5哈希值以及在加载数据时验证的cookie的加密密钥,请参阅system/libraries/Session.php,function sess_read()lines 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;
   }
}
Run Code Online (Sandbox Code Playgroud)


shi*_*hin 5

这不是直接回答你的问题,但我认为这可能有用.

使用以下内容查看PHP会话.

print_r ($_SESSION);
Run Code Online (Sandbox Code Playgroud)

使用以下命令查看CI会话.

print_r ($this->session->userdata);
Run Code Online (Sandbox Code Playgroud)