【问题标题】:CodeIgniter sessions keep getting destroyedCodeIgniter 会话不断被破坏
【发布时间】:2015-07-18 17:49:38
【问题描述】:

我正在开发一个使用 CodeIgniter 2.1.3 的旧应用程序。在开发过程中,它在一个 vhost 上运行,可通过 http://vhostname/app 访问(相当于 xampp/htdocs/project/app)。

我将实时系统 1:1 复制到我的开发系统(包括数据库和所有内容)。

系统使用会话来存储访问者的临时数据(例如购物车)。我的问题:在我的开发环境中,每次刷新都会破坏会话。经过一些测试,我发现它发生在system/core/Sessions.php

        // 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;
        }

但我完全不知道为什么会发生这种情况,而且我的想法会慢慢用完。

实时系统和开发系统之间唯一值得一提的区别:

更新: 至少我刚刚找到了哈希与加密密钥不匹配的原因。我包括来自 WordPress 的 wp-head.php 以访问 WordPress 功能。但在这一点上,我的会话似乎“损坏”了 - 没有包含会话保持活动状态。

更新 2: 好吧,我想我越来越近了。我试图比较会话 cookie,一个带有 wordpress 包含的版本,一个没有。实际上有很大的不同:

包含 WordPress 的 cookie:

a:6:{s:10:\"session_id\";s:32:\"8e3b975d0b30f6b229f475b2f03947a0\";s:10:\"ip_address\";s:9:\"127.0.0.1\";s:10:\"user_agent\";[...]

没有 WordPress:

a:6:{s:10:"session_id";s:32:"7451cd27e1b45d2c7b8a042ed6b2bf9e";s:10:"ip_address";s:9:"127.0.0.1";s:10:"user_agent";[...]

这些引号从何而来?

谢谢!

【问题讨论】:

标签: php codeigniter session


【解决方案1】:

检查配置文件中的会话设置

$config['sess_match_useragent'] = TRUE;

如果 sess_match_useragent 设置为 true。然后让它为假并尝试。

作为 codeigniter 每次都会检查 useragent 并返回它的值

Mozilla/5.0 (Windows NT 5.1; rv:13.0a1) Gecko/20120206 Firefox/13.0a1

Mozilla/5.0 (Windows NT 5.1; rv:13.0a1) 

并检查 cookie。有时它会修剪 user_agent 并保存在 cookie 中,但与导致此问题的完整返回值进行比较。

如果您使用数据库在 codeingiter 中保存会话

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 300;
enter code here

然后在 CI_session 表中增加 user_agent 列的长度。

【讨论】:

  • 更改会话配置根本没有改变任何东西。我已经通过将stripslashes 添加到sess_read 函数来临时修复它,但是我猜修改核心不应该是正确的解决方案......
  • 您是否更改了 $config['sess_match_useragent'] = TRUE;为假?不要更改核心库如果您想要任何更改然后扩展库
猜你喜欢
  • 2019-02-23
  • 2013-10-31
  • 1970-01-01
  • 2015-07-02
  • 2017-09-11
  • 1970-01-01
  • 2016-11-15
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多