我应该在 CodeIgniter 中使用哪个会话库?
Posted
技术标签:
【中文标题】我应该在 CodeIgniter 中使用哪个会话库?【英文标题】:Which session library should I use with CodeIgniter? 【发布时间】:2011-04-09 11:31:21 【问题描述】:我最近开始使用 CI 和 CI 会话,但我注意到使用 CI 会话比使用基本 php 会话更耗时:数组。
我有一个名为$_SESSION['stats']
的数据数组,无论登录/注销如何都会持续存在,然后我将数据以以下形式存储在该数组中:
$_SESSION['stats']['last_page'] = $_SERVER['REQUEST_URI'];
。
当用户注销时,它会将 stats 数组保存在一个变量中,清除会话,然后将其加载回新会话中。
问题是为了编辑 last_page 键,而不是上面的一行,我必须使用这个代码:
$stats = $this->CI->session->userdata('stats');
$stats['last_page'] = $_SERVER["REQUEST_URI"];
$this->CI->session->set_userdata('stats', $stats);
这是我在 CI 会话中发现的众多烦恼之一,这使我对它作为我的会话处理程序感到不满意。所以我的问题是:我应该在 CodeIgniter 中使用哪个会话系统?...使用 CI 会话有什么原因吗?有没有推荐的 CI 库?为什么不只使用 PHP 会话?
谢谢,
勒芒
【问题讨论】:
我对 CI 一无所知,但看起来你可以通过创建一个 Stats 类并存储它的实例来解决这个问题。然后你可以直接使用$this->CI->session->userdata('stats')->setLastPage($_SERVER['REQUEST_URI']);
我知道这不是你问的那样,但这也有其他好处(比如摆脱一些魔术字符串和帮助文档)。
【参考方案1】:
CI 会话提供了一些额外的功能; 例如每隔给定时间自动重新生成会话 ID(出于安全考虑)、IP 地址跟踪和 flashdata(会话数据读取一次后清除)。
CI 的会话机制将所有数据存储在 cookie 中。 PHP 的原生会话机制是存储在服务器端的。每个都有它的优点/缺点。 Cookies 只能保存 4KB 的数据,所以如果你在会话 PHP 原生会话中存储大量数据可能会更好。
如果您决定要使用原生 PHP 会话,请使用: Session Hybrid (CI 1.7.2)
Session Hybrid 使用原生 PHP 会话,可以将会话数据存储在默认的 CI 数据库中,是 CI 会话类的直接替代品,并且只需要重写一个文件。
[* 如果使用 1.7.0 之前的 CI 版本,请尝试 PHPSession 和 Native Session]
附注:如果您选择继续使用 CI 的会话,为了提高安全性,您可以将会话存储在数据库中并加密 cookie(请参阅Session Preferences)。
【讨论】:
谢谢您的信息。我决定迁移回 PHP 会话,因为它们更易于使用。 (并允许手动 sesseion_regeneration)【参考方案2】:听起来你正在使用面包屑方法。
这可能会有所帮助,http://codeigniter.com/forums/viewthread/137949/
要回答您的其他问题,是的,使用 CodeIgniter 会话库是有充分理由的。我使用它是因为我需要将用户会话数据存储在我的数据库中(更安全),并且该库具有加密 cookie 的能力,如果启用了全局 XSS 过滤,那么数据也将被清除。
【讨论】:
1.为什么数据库更安全? 2. 我可以在页面开始时将 CI 会话中的变量卸载到 $_SESSION 并在最后上传该变量吗? 1.因为默认情况下,CI 将未加密的会话变量存储在 cookie 中,即它们在用户计算机上是明文形式。如果会话变量存储在数据库中,那么它们不会存储在 cookie 中。 @lemiant 发生的情况是,存储在用户本地计算机上的唯一内容是只有您的站点才能使用的加密 ID。这阻碍了大多数会话劫持尝试。以上是关于我应该在 CodeIgniter 中使用哪个会话库?的主要内容,如果未能解决你的问题,请参考以下文章
即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为啥?
CodeIgniter 2.1.0 的会话库中是不是有任何已知的错误?为啥我会被踢出去? [关闭]