Codeigniter会话不适用于PHP 7

hri*_*shi 11 php session codeigniter

我在PHP 5.6上使用codeigniter版本3.0.6,它工作正常.但是当我在PHP 7.1上运行相同的项目时,codeigniter会话无法正常工作.我设置如下的会话

$login_session = $this->session->set_userdata("user_session",$session_data);
Run Code Online (Sandbox Code Playgroud)

当我打印 $ login_session时, 它在PHP 7上是空白的

Sha*_*fiq 30

最近我通过将我的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);
Run Code Online (Sandbox Code Playgroud)

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

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

这个对我有用.

  • 多谢兄弟!有效.希望这不会破坏任何安全权利吗? (2认同)
  • 厕所。不,这不会破坏任何安全性问题。 (2认同)
  • 这不是一个好的答案。它会工作,但问题是使用的 Codeigniter 版本。检查@Siddesh 答案。 (2认同)

pim*_*ace 11

我建议采取以下步骤:

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

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

  • 这是这个问题的解决方案应该是最佳答案 (4认同)

PHP*_*... 10

我遵循以下步骤设法克服了这一问题。

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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

而已。

  • 好的,谢谢,这可行,但警告:ini_set():会话处于活动状态。此时您无法在第 3 行的 index.php 中更改会话模块的 ini 设置 (2认同)

Sid*_*esh 7

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

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

在这里找到这个答案


小智 7

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

$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;
Run Code Online (Sandbox Code Playgroud)

设置文件夹权限0700

如果需要的话自动加载会话

$autoload['libraries'] = array('session');
Run Code Online (Sandbox Code Playgroud)

如何设置会话

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

$this->session->set_userdata($session);
Run Code Online (Sandbox Code Playgroud)

获取用户数据一组示例

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

if (!$this->session->userdata('islogged')) {
     redirect('logout');
}
Run Code Online (Sandbox Code Playgroud)


Leo*_* Lo 7

会话ID在php 7.1中有所不同,并且未通过正则表达式检查。

一个简单的修复方法:在system / libraries / Session / Session.php中,第133行

OR ! preg_match('/^[0-9a-f]{40}$/', $_COOKIE[$this->_config['cookie_name']])
Run Code Online (Sandbox Code Playgroud)

删除“ {40} $”

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

问题在于,由于正则表达式不匹配,因此从cookie中删除了会话ID。因此,会话ID总是会更新。

这样可以修复正则表达式,并防止其运行“ unset($ _ COOKIE [$ this-> _ config ['cookie_name']]);”行。

这完全对我有用!

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

  • 如果您不想更新 codeigniter 或任何其他东西,最好的解决方案 (3认同)