在CodeIgniter中,会话数据默认保存在cookie中。但是我的服务器上必须还有一个文件(名为会话ID)来验证数据(在cookie中)是否有效,或者我错了?
我正在搜索会话保存的位置。我已经查看了“session.save_path”目录(/ var / lib / php5),但是在这个目录中只有其他会话,而不是CodeIgniter会话。
我也没有在数据库中保存会话,那么CodeIgniter如何知道数据(在cookie中)是否有效?
答案 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中只存储一个值。该值是序列化和加密的数组。该数组包含四条信息。
会话ID是随机字符串。这是用于与会话表中的数据相关联的字符串。每个请求都会重新生成(并重新加密)字符串,并在cookie和表中进行更新。如果这与会话表值不匹配,则表数据不可访问,并将在内置垃圾回收中捕获。
或者,您也可以在CI会话类中强制执行IP检查。这意味着除了随机重新生成会话ID之外,它们的用户IP也必须保持一致或会话将被销毁。
或者,您也可以强制执行UA检查和超时值。
因此,传统的会话文件永远不会写入缓存文件夹。除了非个人数据之外,CI Cookie会话对所有人都毫无价值,例如记住Web界面的UI状态。 CI数据库会话非常灵活。如果你的PHP安装包括Mcrypt,那么安全性也很强大。如果你没有Mcrypt,他们仍然相当安全,但不会通过考虑,例如PCI合规。
您可以在CI manual中阅读更多内容,但这是我认为与您的问题最相关的信息摘要。