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

时间:2010-02-01 15:27:53

标签: php codeigniter cookies session

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

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

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

5 个答案:

答案 0 :(得分: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 :(得分: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;
   }
}

答案 2 :(得分:5)

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

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

print_r ($_SESSION);

使用以下内容查看CI会话。

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

答案 3 :(得分:3)

今天刚刚用Firebug进行了测试..

要跟进Shanee的回答,请在CodeIgniter的“application / config / config.php”文件中,如果有人设置:

$config['sess_use_database'] = TRUE;

然后只将默认CI会话数据:session_id,IP_address ..存储为浏览器cookie。

set_userdata()函数提供的任何其他自定义数据(例如用户名和密码)不再是Cookie的一部分,而是存储在数据库中。

答案 4 :(得分:0)

当我谈到下面的“会话”时,我指的是CI会话,而不是PHP会话。

如果您使用默认选项(手册中不应将其用于敏感数据),那么您的问题的答案是它不知道。它信任cookie。

要以设计的安全方式使用它,您应该使用数据库会话选项以及加密选项。使用这两个选项,这就是您的问题的答案:

Cookie中只存储一个值。该值是序列化和加密的数组。该数组包含四条信息。

  • 'session_id',=>随机哈希
  • 'ip_address'=> 'string - 用户IP地址'
  • 'user_agent'=> 'string - 用户代理数据'
  • 'last_activity'=>时间戳

会话ID是随机字符串。这是用于与会话表中的数据相关联的字符串。每个请求都会重新生成(并重新加密)字符串,并在cookie和表中进行更新。如果这与会话表值不匹配,则表数据不可访问,并将在内置垃圾回收中捕获。

或者,您也可以在CI会话类中强制执行IP检查。这意味着除了随机重新生成会话ID之外,它们的用户IP也必须保持一致或会话将被销毁。

或者,您也可以强制执行UA检查和超时值。

因此,传统的会话文件永远不会写入缓存文件夹。除了非个人数据之外,CI Cookie会话对所有人都毫无价值,例如记住Web界面的UI状态。 CI数据库会话非常灵活。如果你的PHP安装包括Mcrypt,那么安全性也很强大。如果你没有Mcrypt,他们仍然相当安全,但不会通过考虑,例如PCI合规。

您可以在CI manual中阅读更多内容,但这是我认为与您的问题最相关的信息摘要。