Codeigniter 会话不适用于 PHP 7

Posted

技术标签:

【中文标题】Codeigniter 会话不适用于 PHP 7【英文标题】:Codeigniter session is not working on PHP 7 【发布时间】:2018-01-27 02:58:15 【问题描述】:

我在 PHP 5.6 上使用 codeigniter 版本 3.0.6,它运行良好。但是当我在 PHP 7.1 上运行相同的项目时,codeigniter 会话不起作用。我如下设置会话

$login_session = $this->session->set_userdata("user_session",$session_data);

当我打印 $login_sessionphp 7 上它是空白的

【问题讨论】:

***.com/questions/43718961/… 您检查过Bug 问题吗? github.com/bcit-ci/CodeIgniter/issues/4830 这里是解决方案检查它是否有效:jianshu.com/p/4bf22c8af19d 它的中国老兄 升级到 3.1.5 【参考方案1】:

最近我将 php 版本从 5.6 升级到 7.1 时遇到了同样的问题 我的开发环境是使用php7.1.4的XAMPP(Apache + MariaDB)

请按照以下步骤操作:

1) 进入system/libraries/Session/Session.php

2) 通过添加 // 来注释 session_start()。

3) 转到 312-315 附近的行,其中说安全为王,并注释掉以下行:

ini_set('session.use_trans_sid', 0);
ini_set('session.use_strict_mode', 1);
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.hash_function', 1);
ini_set('session.hash_bits_per_character', 4);

4) 然后转到你的主 index.php(根 index.php)

5) 在顶部添加一次 session_start()。

它对我有用。

【讨论】:

谢谢兄弟!有效。希望这不会破坏任何安全权利? 厕所。不,它不会破坏任何安全问题。 你拯救了我的一天,但我花了 5 个小时才找到它,谢谢你,非常感谢! 这不是一个好的答案。它会工作,但问题是使用的 Codeigniter 版本。检查@Siddesh 的答案。 我在这个问题上花了将近 6 个小时,终于解决了谢谢@Shafiq 兄弟【参考方案2】:

php 7.1 中的会话 id 不同,未通过正则表达式检查。

一个简单的修复: 在 system/libraries/Session/Session.php arround line 133

OR ! preg_match('/^[0-9a-f]40$/', $_COOKIE[$this->_config['cookie_name']])

删除“40$”

OR ! preg_match('/^[0-9a-f]/', $_COOKIE[$this->_config['cookie_name']])

问题是由于正则表达式不匹配,会话 ID 已从 cookie 中删除。所以会话 id 总是更新。

这可以修复正则表达式并防止它运行该行 "未设置($_COOKIE[$this->_config['cookie_name']]);"

它完全适合我!

仅供参考。我自己修好后找到这个。 https://github.com/bcit-ci/CodeIgniter/issues/4830

【讨论】:

如果您不想更新 codeigniter 或任何其他东西,最好的解决方案 这是最好的解决方案,而不是像顶部答案那样编辑 2 个文件 这个解决方案简直完美,但我需要知道,它会导致任何安全问题吗? 似乎不会导致安全问题,因为它只是去掉了长度检查。如果会话id不匹配,它仍然没有通过检查【参考方案3】:

我提出以下步骤:

    转到https://www.codeigniter.com,下载最新的3.x.x版本的框架并解压。 在现有应用中复制系统文件夹,将其保存在其他位置,然后删除应用文件夹中的那个。 复制您刚刚下载的系统文件夹,并将其放在您删除最后一个文件夹的位置。 完成!

这可以无缝地解决问题,节省您的时间以及将您的应用搞砸的潜在风险。

【讨论】:

这是解决这个问题的最佳答案【参考方案4】:

我发现问题出在一些早期版本的 Codeigniter 3 上,这是他们网站上已经报告的错误。该错误已得到修复,并且在最新版本的 Codeigniter 3 中不会发生此问题。

如果您已经使用了错误版本的 cogeinter,请考虑将系统文件夹替换为最新版本的文件夹。

找到这个答案here

【讨论】:

这是复制的答案并在上面的线程中给出。你为什么要复制这个而不是给出 URL? 因为该网站的文章可能不再可用。【参考方案5】:

按照这些步骤,我设法克服了这个问题。

1) 转至system/libraries/Session/Session.php

2) 通过添加 // 搜索 session_start() 评论 session_start()

3) 下到 312 附近的行(或搜索 Security is king)并注释掉所有 ini_set()

ini_set('session.use_trans_sid', 0);
ini_set('session.use_strict_mode', 1);
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.hash_function', 1);
ini_set('session.hash_bits_per_character', 4);

4) 然后转到你的主 index.php(根 index.php)

5) 在顶部添加session_start()

6) 在session_start() 下方添加Session.php 中注释的以下行

ini_set('session.use_trans_sid', 0);
ini_set('session.use_strict_mode', 1);
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.hash_function', 1);
ini_set('session.hash_bits_per_character', 4);

就是这样。

【讨论】:

好的,谢谢你这工作,但警告:ini_set():会话处于活动状态。此时您无法在第 3 行的 index.php 中更改会话模块的 ini 设置 恕我直言...更改系统文件的形式真的很糟糕。【参考方案6】:

确保您已设置会话保存路径

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = APPPATH . 'cache/session/';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

设置文件夹权限0700

根据需要自动加载会话

$autoload['libraries'] = array('session');

如何设置会话

$session = array('islogged' => true, 'user_id' => '1');

$this->session->set_userdata($session);

获取用户数据一组示例

echo $this->session->userdata('user_id');

if (!$this->session->userdata('islogged')) 
     redirect('logout');

【讨论】:

【参考方案7】:

将 Codeigniter 升级到最新版本。 问题将得到解决。

【讨论】:

【参考方案8】:

你只需要进入application/config/config.php这个文件并设置会话路径

$config['sess_save_path'] = sys_get_temp_dir();

这将解决您的问题。

【讨论】:

【参考方案9】:

我也遇到了同样的问题,浪费了一整天。 这是简单的解决方案。

只需下载CodeIgniter 3.1.11版本并复制系统文件夹并将系统文件夹替换为您的旧系统文件夹

【讨论】:

【参考方案10】:

问题出在你的 PHP 版本上,PHP 7.1 不是很稳定,而且会话有很多问题。将您的 PHP 版本更改为 7.0,会话将自动开始工作。

【讨论】:

请解释下投票 我最近从 php5.6 切换到 php7.1。会话立即停止工作。这个建议是唯一对我有用的东西。重新安装 codeigniter 核心并检查我的会话配置没有帮助。但是,我有几个版本的 PHP 可用,当我从 7.1 切换到 7.0 时,我的会话再次工作。

以上是关于Codeigniter 会话不适用于 PHP 7的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 4 不适用于带有 PHP 8.0 的 xampp

Codeigniter 删除 index.php 在本地工作,但不适用于 aws ELB

mPDF 库不适用于 php7.2 codeigniter

动态 PHP 变量不适用于使用 mPDF 的 codeigniter php 视图文件

cron 作业不适用于 codeigniter 2.2.5

Codeigniter 3,适用于“http”但不适用于“https”