Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Codeigniter会话问题_Php_Codeigniter_Session - Fatal编程技术网

Php Codeigniter会话问题

Php Codeigniter会话问题,php,codeigniter,session,Php,Codeigniter,Session,我在具有登录功能的网站上遇到了与CodeIgniter会话相关的几个问题: 今天有两个用户报告了一个问题,在登录后,他们被重定向到主页,但没有登录。如果他们刷新页面,则表示他们已登录。此外,如果单击“注销”,则不会注销。如果他们随后刷新页面,则会注销。这个问题以前没有出现过(这个网站已经运行了将近一年),也没有出现在我的用户名/机器上 我注意到在数据库的sessions表中有重复的记录(相同的IP) 一些用户报告说已经登录到另一个人(顶部的消息说欢迎X使用另一个人的名字)。我对代码进行了四次检查

我在具有登录功能的网站上遇到了与CodeIgniter会话相关的几个问题:

  • 今天有两个用户报告了一个问题,在登录后,他们被重定向到主页,但没有登录。如果他们刷新页面,则表示他们已登录。此外,如果单击“注销”,则不会注销。如果他们随后刷新页面,则会注销。这个问题以前没有出现过(这个网站已经运行了将近一年),也没有出现在我的用户名/机器上

  • 我注意到在数据库的sessions表中有重复的记录(相同的IP)

  • 一些用户报告说已经登录到另一个人(顶部的消息说欢迎X使用另一个人的名字)。我对代码进行了四次检查,检查是否存在任何问题,这些问题可能会导致用户登录到另一个用户名,但没有发现任何漏洞

  • 如果您有任何帮助和建议来解决这些问题,我们将不胜感激。以下是我的会话设置:

    $config['sess_cookie_name']     = 'ci_session';
    $config['sess_expiration']      = 7200;
    $config['sess_expire_on_close'] = TRUE;
    $config['sess_encrypt_cookie']  = TRUE;
    $config['sess_use_database']    = TRUE;
    $config['sess_table_name']      = 'sessions';
    $config['sess_match_ip']        = TRUE;
    $config['sess_match_useragent'] = TRUE;
    $config['sess_time_to_update']  = 300;
    
    我发现这些设置到目前为止效果最好。以下是登录控制器功能:

    public function index()
    {        
        // if user is already logged in, redirect him to main
        if ($this->users_model->check_if_logged_in())
            redirect(site_url('gmat/' . format_gmat_url()));
    
        $this->load->library('form_validation');
    
        $this->form_validation->set_error_delimiters('', '');
        $this->form_validation->set_message('required', 'The credentials you entered are invalid.');
        $this->form_validation->set_rules('signin_email', 'Email', 'trim|required|max_length[100]|xss_clean');
        $this->form_validation->set_rules('signin_pswd', 'Password', 'trim|required|max_length[25]|md5|xss_clean');
        $this->form_validation->set_rules('signin_auth', 'Authorization Code', 'trim|required|max_length[100]|xss_clean');
    
        if ($this->form_validation->run() == FALSE)
        {
            $this->session->set_flashdata('error_msg', 'Invalid login, please try again.');
            redirect(site_url('gmat/' . format_gmat_url() . 'sign_up'));
        }
        else
        {
            // Check if user is valid
            $u_email = $this->input->post('signin_email');
            $u_password = $this->input->post('signin_pswd');
            $u_auth = (format_gmat_url() == 'lev2' && $this->input->post('signin_auth') == 0 ? 'notvalid' : $this->input->post('signin_auth')); // for level 2 sign in
    
            $login_result = $this->users_model->check_login($u_email, $u_password, 0, $u_auth);
    
            if ($login_result['success'] == TRUE)
            {
                redirect(site_url('gmat/' . format_gmat_url()));
            }
            else
            {
                $this->session->set_flashdata('error_msg', $login_result['error_msg']);
                redirect(site_url('gmat/' . format_gmat_url() . 'sign_up'));
            }
    }
    }
    
    $u_auth和与“2级登录”相关的任何内容都允许登录用户访问另一个“子站点”。主站点的登录页面不使用任何与之相关的内容,也不使用任何与使用身份验证代码登录相关的内容

    模型功能检查\ U登录:

    public function check_login($email, $password, $admin = 0, $auth_code = 0)
    {
        $login_result = array('success' => FALSE, 'error_msg' => '');
    
        $this->load->model('users_model');
    
        $user_condition = "u_email = '" . $email . "' AND u_password = '" . $password . "' AND u_authorized = '' AND u_active = 1";
        $user_condition .= ($admin == 1 ? " AND u_admin = 1" : "");
        $user_condition .= ($auth_code != 0 ? " AND u_access_level2 = 1" : "");
        $user = $this->users_model->get_db_users($user_condition);
    
        $u_logged_in_level2 = FALSE;
    
        if(count($user) == 1)
        {
            if ($auth_code != 0 || $auth_code != '0')
            {
                $this->load->model('settings_model');
    
                // Signing in on level 2, check for authorization code
                $settings = $this->settings_model->get_db_settings("s_code = 'level_2_authorization'");
    
                if ($settings[0]['s_value'] != $auth_code)
                {
                    $login_result['success'] = FALSE;
                    $login_result['error_msg'] = 'Invalid authorization code.';
                    return $login_result;
                }
                else
                {
                    $u_logged_in_level2 = TRUE;
                }
            }
    
            $login_result['success'] = TRUE;
    
            $this->session->sess_destroy();
            $this->session->sess_create();
    
            // Create session data
            $data = array(
                    'user_id' => $user[0]['u_id'],
                    'user_email' => $email,
                    'user_first_name' => $user[0]['u_first_name'],
                    'user_family_name' => $user[0]['u_family_name'],
                    'user_father_name' => $user[0]['u_father_name'],
                    'user_mobile' => $user[0]['u_mobile'],
                    'user_admin' => $user[0]['u_admin'],
                    'access_level2' => $u_logged_in_level2,
                    'logged_in' => TRUE
                    );
    
            $this->session->set_userdata($data);
        }
        else
        {
            $login_result['error_msg'] = 'Invalid login, please try again.';
        }
    
        return $login_result;
    }
    

    如果用户以其他人的名字登录,情况会非常糟糕

    每当有人访问您的网站时,自动加载会话库将自动为用户代理创建会话。关键是,如果有人明确登录到您的网站,同一会话应该会使用用户数据进行更新

    我认为您正在自动加载会话库。将会话cookie名称从ci_会话更改为cisession或其他名称。删除下划线,与IE(出色的Microsoft)不太匹配。它在很多情况下都有帮助


    请共享会话表的架构。确保将varchar(255)用于用户\代理字段。在此之后,我认为您的数据库中不会有来自同一IP和用户代理的多个会话。

    “一些用户报告登录到另一个人”这是非常糟糕的!但是,查看您的CI设置,会话绑定到IP和UA。因此,对于会话ID,IP和UA对于多个用户来说都是相同的是非常不可能的。你说这个网站已经上线将近一年了,这些问题是最近才发生的吗,比如PHP或CI更新之后?谢谢你的评论!我之所以将IP和UA检查设置为TRUE,是因为“用户登录到另一个用户”问题。由于我将这些设置设置为TRUE,所以幸运的是,我没有报告该问题。最近才出现的问题是我帖子中的问题。经过一些调试,我发现这个问题一直出现在IPad上,而报告它的用户使用的是Mac。所以我想这是一个狩猎问题。然而,我仍然无法解决它。登录后,没有会话数据,但刷新页面后,会话数据会返回。但是请注意,即使在Mac Safari上,以前也没有出现过此问题。据我所知,服务器上的PHP版本没有任何更改或更新,我也没有接触到CI文件夹。