【问题标题】:CodeIgniter sessions vs PHP sessionsCodeIgniter 会话与 PHP 会话
【发布时间】:2011-01-01 14:38:43
【问题描述】:

我对 CodeIgniter 比较陌生,并且正在制作我的第一个 CI 项目,其中包含用户帐户等。过去,我一直为此使用 PHP 的 $_SESSION 变量。但是,CI 似乎有自己的会话机制,它声称“更好”

CI 的会话机制似乎将所有数据存储在一个 cookie 中?就我个人而言,我喜欢将所有数据存储在服务器上,使用像 PHP 的本机会话机制这样的 cookie-key 访问的想法......我是不是在愚蠢地认为这更好?我应该接受 CI 的机制吗?还是我应该继续使用原生 PHP 会话?

你们是做什么的?

谢谢,
马拉

【问题讨论】:

    标签: php codeigniter session


    【解决方案1】:

    根据我使用 CI 的经验,我在其会话中遇到了一些异常情况,但对于大多数日常需求,该库很好并且易于使用。正如它所指出的,Flashdata 是一个非常好的功能。

    如果您选择继续使用 CI 的会话,我强烈建议将会话存储在数据库中,另外,加密 cookie:

    $config['sess_encrypt_cookie'] = TRUE;
    $config['sess_use_database']   = TRUE;
    $config['sess_table_name']     = 'sessions';
    

    数据库结构应该如下:

    CREATE TABLE IF NOT EXISTS  `sessions` (
        session_id varchar(40) DEFAULT '0' NOT NULL,
        ip_address varchar(16) DEFAULT '0' NOT NULL,
        user_agent varchar(50) NOT NULL,
        last_activity int(10) unsigned DEFAULT 0 NOT NULL,
        user_data text NOT NULL,
        PRIMARY KEY (session_id)
    );
    

    【讨论】:

    • 数据库中的会话是使用 codeigniter 获得最佳安全性的最佳选择。
    • 谢谢。经过更多研究,我发现应该从会话 cookie 名称中删除下划线,因为这会导致 IE 阻塞。
    • @Mala:“窒息”是什么意思?您从哪里了解到这个 IE cookie 命名问题?我知道在网站域link 中存在与下划线相关的错误,但这是一个不同的问题。
    • 遗憾的是我不确定,这是我三年前在某个文档中看到的内容:\ 我只记得有下划线,会话在 IE 中没有会话,没有它一切正常正如预期的那样。这可能是旧 CI 实现中的一个错误。抱歉,我无法提供更多帮助。
    【解决方案2】:

    手册说更灵活而不是更好 ;-)

    我认为 CodeIgnite 会话类的主要好处是它与框架集成,并提供了一些额外的功能,例如 IP 地址跟踪和它所谓的 flashdata(会话数据被删除为刚读完)。如果您首先使用框架,这意味着这些选项可能对您很有吸引力。

    无论如何,您也可以将会话数据保存到数据库中:

    http://codeigniter.com/user_guide/libraries/sessions.html

    【讨论】:

      【解决方案3】:

      保持 PHP 会话获取重要信息,使用 CI 会话获取不太重要的信息。

      在这里阅读 wyh.http://codeigniter.com/forums/viewthread/130577/

      【讨论】:

      • 该线程的普遍共识是 CI 会话用于重要信息(加密/数据库存储),但它们与 Internet Explorer 不兼容。
      • 实际上,我收回了关于 Internet Explorer 的那部分内容。显然,这些信息是由阴谋论者传播的。
      【解决方案4】:

      我知道这是一篇较旧的帖子,但我觉得值得分享我的发现。

      由于 CI 使用基于 cookie 的方法(即使使用数据库存储),它会导致我的特定应用程序出现问题,该应用程序向通过 curl 请求数据的远程客户端提供数据。底线是 Cookie 和跨站点脚本,虽然可以管理,但不能很好地结合使用。

      我选择尝试用我自己的 MY_Session.php 覆盖 CI 提供的本机 Session.php 类。我很高兴发现这并不太难,但惊讶地发现 CI 正在重新生成会话 ID,即使我的脚本明确提供了它们。

      根据 CI 手册

      用户的唯一会话 ID(这是一个统计随机字符串 具有非常强的熵,使用 MD5 散列以实现可移植性,并且 每五分钟重新生成一次(默认情况下)

      虽然我可能会找到一种方法来覆盖它,但我想知道恢复到 PHP 会话是否不会容易得多。

      如果您要使用 CI,请深思。

      【讨论】:

        【解决方案5】:

        CI 会话有存储大小限制

        如您所知,CI 会话基本上是 cookie,无论您是否对其进行加密。就安全性而言,两者各有利弊。

        我关心的是 CI 会话的大小限制,它基本上只能保存 4 kb 的数据,因为它基本上是一个 cookie,而 Native PHP 会话只在 cookie 上存储引用 id,所有会话数据都存储在服务器内存中。当您需要在会话中存储大量项目时,这会很方便。

        比如说一个包含更多商品的购物车,或者一个包含 50 多首曲目的用户音乐播放列表……等等。

        我希望这些信息有一天对某人有所帮助。

        干杯..!!

        【讨论】:

          猜你喜欢
          • 2014-02-21
          • 2013-01-06
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 2013-10-31
          • 1970-01-01
          • 2012-02-29
          相关资源
          最近更新 更多