【问题标题】:SESSION variable is reset on redirect() in Codeigniter phpSESSION 变量在 Codeigniter php 中的 redirect() 上被重置
【发布时间】: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,看我的回答:stackoverflow.com/a/46876622/2275490
  • @Vickel 有正确的答案。您需要升级您的 CI 版本。
  • 我的相同代码正在运行,但它突然停止运行,仍然需要更新 CI?

标签: php codeigniter xampp wamp


【解决方案1】:

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

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

    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);

  6. 转到主index.php,它是第一个index.php,与子目录'application'、'system'、'user_guide'等位于同一目录。
  7. 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);

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2013-02-07
    • 2012-05-30
    • 1970-01-01
    相关资源
    最近更新 更多