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



我面临着会话变量在操作重定向时重置的奇怪问题。

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

管理员.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 中尝试过这个,所有浏览器,但问题仍然保持不变,任何帮助将不胜感激。

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

  1. 转到系统/库/会话/会话.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. 转到主索引.php,它是第一个索引.php与子目录"应用程序","系统","user_guide"等位于同一目录中。
  7. session_start()放在< ?php之后

希望这能帮助你。

您必须使用this->session->set_userdata()来设置会话。this->session-> set_ flashdata()用于设置在下一步操作后删除的闪存消息。

由于新的 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 设置为"严格"或"宽松"(Lax 现在将成为默认值(,则不会。

溶液:

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

在 PHP 中,可以实现如下

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

最新更新