SESSION 变量在 Codeigniter php 中的 redirect() 上被重置

Posted

技术标签:

【中文标题】SESSION 变量在 Codeigniter php 中的 redirect() 上被重置【英文标题】:SESSION variable is reset on redirect() in Codeigniter php 【发布时间】:2020-02-08 07:11:23 【问题描述】:

我遇到了一些奇怪的问题,即会话变量在操作重定向时被重置。

我正在使用 Codeigniter 并在登录后重定向到仪表板操作,在使用 DB 验证凭据后,我在登录操作中获取数据,但是当我使用 redirect() 重定向到仪表板时,会话变量消失了。

Admin.php

<?php class admin extends CI_Controller 

    function login()
    
        $login = $this->Admin_model->login($this->input->post()); // <-- verify data and set to session
        if($login)
        
            $this->session->set_flashdata("success","Logged in Successfully");
            var_dump($_SESSION); // <-- able to fetch data from session
            // exit();
            redirect("admin/dashboard");
        
        else
        
            $this->session->set_flashdata("error","Invalid Credentials!! Please Try Again!!");
            redirect("admin");
        
    

    function dashboard()
    
        var_dump($_SESSION); // <-- session data is vanished and not able to get userdata('id')
        exit();
        if($this->session->userdata('id') != '')
        
            $data['active_tab'] = "dashboard";
        
        else
        
            redirect("admin");
        
    
?>

Admin_model.php

<?php Class Admin_Model extends CI_Model

    function login($data)
    
        $user = $this->db->get_where("users",array("username" => $data['username'],
                                     "password" => md5($data['password']),
                                     "is_active" => "1")
                                    )->row_array(); 
        if(!empty($user))
        
            $this->set_user_session($user);
            return true;
        
        else
        
            return false;
        
    

    function set_user_session($login)
    
        $arr = array();
        $arr["id"] = $login["id"];
        $arr["username"] = $login["username"];
        $this->session->set_userdata($arr);
    
?>

在 xampp 和 wamp 中尝试过,所有浏览器,但问题仍然存在,任何帮助将不胜感激。

【问题讨论】:

您使用的是什么 CI 版本和什么 PHP 版本?如果将值分配给 $_SESSION 数组,它会起作用吗? 我的 CI 版本是 3.1.0 和 php 7.2.18 早期的3.1.x版本出现问题,尝试升级到最新的3.1.11,看我的回答:***.com/a/46876622/2275490 @Vickel 有正确的答案。您需要升级您的 CI 版本。 我的相同代码正在运行,但它突然停止运行,仍然需要更新 CI? 【参考方案1】:

您使用的是哪个版本的 CodeIgniter?您可以尝试以下步骤。

    转到 system/libraries/Session/Session.php 通过添加// 评论session_start()。我们想重新定位 sessionn_start()。 查找 (using ctrl + f) 一条写有 Security is king 的评论。注释掉该注释下的所有行,直到函数结束。在我的例子中,我注释掉了第 315 - 320 行。 在第 282 行将这行 ini_set('session.name', $params['cookie_name']); 更改为 ini_set('session.id', $params['cookie_name']);

    注释掉下面几行

    line 108 //session_set_save_handler($class, TRUE); line 290-296 // session_set_cookie_params( // $params['cookie_lifetime'], // $params['cookie_path'], // $params['cookie_domain'], // $params['cookie_secure'], // TRUE // HttpOnly; Yes, this is intentional and not configurable for security reasons // ); line 305 //ini_set('session.gc_maxlifetime', $expiration);

    转到主index.php,它是第一个index.php,与子目录'application'、'system'、'user_guide'等位于同一目录。 将session_start() 放在&lt; ?php 之后

希望对你有帮助....

【讨论】:

这给出了错误A PHP Error was encountered Severity: Warning Message: ini_set(): A session is active. You cannot change the session module's ini settings at this time Filename: Session/Session.php Line Number: 305 它工作了......!!!!我们需要注释掉更多的行,但你能解释一下我们禁用的所有东西吗? PHP 7 升级 - * 已知会话/COOKIE 错误 - 将 php 5 升级到 php 7 将解决已知的会话/cookie 错误。 $this->session->set_userdata(); 似乎有问题并且每次重定向时,cookie 值都会被覆盖。 @NitishLad 你还评论了什么,能告诉我吗?【参考方案2】:

您必须使用this-&gt;session-&gt;set_userdata() 来设置会话。 this-&gt;session-&gt; set_ flashdata() 用于设置在下次操作后删除的闪烁消息。

【讨论】:

我正在使用相同的即 $this->session->set_userdata($arr); 设置会话变量,它也设置,但在签入后消失仪表板操作。【参考方案3】:

新版本的浏览器可能会因为新的 cookie 政策而破坏会话。

参考资料 https://developers.google.com/search/blog/2020/01/get-ready-for-new-samesitenone-secure

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite

每当需要将 cookie 发送到服务器时,浏览器都会看到 SameSite 属性来决定 cookie 是发送到服务器还是被阻止。对于用户操作,它会发送到服务器,但对于自动重定向,如果 SameSite 设置为“Strict”或“Lax”(Lax 现在将成为默认值),则不会。

解决方案:

可以将 cookie 属性 SameSite 设置为“无”,同时将“安全”属性指定为“真”。将“安全”属性设置为“真”将要求您的网站在 https 上运行。使用 http:// 协议运行的站点将无法设置“安全”cookie。 请将 'HttpOnly' 属性设置为 'true' 以使其仅对服务器的 http 请求可访问。

在PHP中可以如下实现

session_set_cookie_params(0, '/PATH/; SameSite=None', , true, true);

【讨论】:

以上是关于SESSION 变量在 Codeigniter php 中的 redirect() 上被重置的主要内容,如果未能解决你的问题,请参考以下文章

PHP:在视图中显示会话变量:CodeIgniter

Facebook SDK + CodeIgniter 会话

如何获取 codeigniter 会话 userdata 变量的值?

在 CodeIgniter 中恢复 session_id

如何在 CodeIgniter 的库中使用 session?

Codeigniter:Session_id 为空