【问题标题】:Session is not being destroy in codeigniter会话没有在 codeigniter 中被破坏
【发布时间】:2017-09-11 10:34:44
【问题描述】:

我正在尝试取消设置当前登录用户的会话。如果我进行正常登录,它工作正常,但是当我使用使用 cookie 记住我的设置时,它不会被破坏。

我设置会话和 cookie 的代码是

public function login() {
    if(isset($this->session->userdata['username']) || isset($_COOKIE['user_id'])){
         $this->load->model('User');

            $p_uid = $this->User->user_login($_COOKIE['user_id'], $_COOKIE['password']);

     redirect(base_url() . "dashboard");
    }else{



    $this->form_validation->set_rules('user_id', 'User ID', 'required');
    $this->form_validation->set_rules('password', 'Password', 'required');
    if ($this->form_validation->run() == FALSE) {
        $this->load->view('login/login');

    } else {

        $user_id = $this->input->post('user_id');
        $password = $this->input->post('password');
        $this->load->model('User');

            $p_uid = $this->User->user_login($user_id, $password);
            //var_dump($p_uid);
            if ($p_uid) {
                if(isset($_POST['remember_me'])){
                    setcookie("user_id",$user_id,time()+86400*30);
                    setcookie("password",$password,time()+86400*30);

                }


               redirect(base_url() . "dashboard/");
            } else {
                $data=array(
                "error"=>"Wrong Userid Or Password"
                );
                $this->load->view('login/login',$data);
            }

    }
    }


}

而我的注销功能是:

public function logout(){

    $this->load->helper('cookie');
    delete_cookie("user_id");
    delete_cookie("password");

    $this->session->unset_userdata("username");
    $this->session->sess_destroy();

    redirect(base_url());
}

我在哪里做错了。请帮忙。谢谢

【问题讨论】:

  • 这是错误的 $this->session->userdata['username'] 你必须像这样使用 $this->session->userdata('username')

标签: php codeigniter session cookies


【解决方案1】:

首先,您的记住我机制存在严重缺陷。见Implementing Secure User Authentication in PHP Applications with Long-Term Persistence

我不明白您的登录是如何工作的。您正在检查是否在会话中设置了 username,然后正在使用 cookie 执行登录。我猜你已经让它工作了,因为|| 的第一部分总是失败,因为$this->session->userdata['username'] 永远不会被设置。从会话中访问username 的正确方法是:

$_SESSION['username']

$this->session->userdata('username')

$this->session->username

最后,通过检查网络选项卡中的请求,确保 cookie 确实被删除。 Codeigniter 通过设置大约一天的负过期时间来删除 cookie,看看您的 Codeigniter 版本是否是这种情况。为获得最佳效果,只需再次设置 cookie 并设置较大的负过期时间,而不是检查是否设置了 cookie,而是检查 cookie 是否为 !empty

【讨论】:

    【解决方案2】:

    我不久前也遇到过同样的问题。我正在尝试所有可能的方法。但我失败了。最后我找到了 ob_startob_clean 的解决方案。注销应该是这样的:

    class controllerName extends CI_Controller
    {
        function __construct()
        {
            parent::__construct();
            ob_start();
            $this->load->library('Session');
            $this->load->helper('cookie');
        }
    
        public function logout()
        {
            $this->load->driver('cache');   
            $user_id = array(
                'name'   => 'user_id',
                'value'  => '',
                'expire' => '0',
                'domain' => '.localhost',
                'prefix' => ''
            );
    
            delete_cookie($user_id);               
            $this->session->sess_destroy();
            $this->cache->clean();
    
            ob_clean();
            redirect(base_url());            
        }
    
    }
    

    为了防止浏览器后退按钮上一个页面加载,你应该这样做

    $sess = $this->session->userdata('username');
    if(empty($sess))
    {
        $this->session->set_flashdata('error', 'Session has Expired. Please login');
        redirect('loginController/method'); 
    }
    else
    {
        # success. 
        # continue the normal code here 
    }
    

    仅供参考:这应该添加到每个函数中,或者由constructor 使用来执行此操作。

    注意:不要在 cookie 中添加密码。 Read - php cookie injection vulnerability?

    【讨论】:

    • 感谢您的帮助:)
    • 为什么会这样?我有类似的情况,其中 1/10 倍 CI 并没有真正将用户注销(注意:我没有使用记住我或类似的东西)。在销毁会话之前和之后添加这些似乎有效。但为什么呢?
    【解决方案3】:
    1. 从会话数组中取消设置单个元素:

      $this->session->unset_userdata('some_name');

    2. 您可以传递一个键数组来取消设置多个值:

      $array_items = array('username' => '', 'email' => ''); $this->session->unset_userdata($array_items);

    【讨论】:

      【解决方案4】:
      public function check_admin_login()
          {
              $admin_email_address=$this->input->post('admin_email_address',true);
              $admin_password=$this->input->post('admin_password',true);
              $this->load->model('admin_model','a_model');
             $result= $this->a_model->check_admin_login_info($admin_email_address,$admin_password);
      //       echo '<pre>';
      //       print_r($result);
      //       exit();
             $sdata=array();
      
             if($result)
             {
                 $sdata['full_name']=$result->admin_full_name;
                 $sdata['admin_id']=$result->admin_id;
                 $this->session->set_userdata($sdata);
                 //$sdata[]
                 redirect('super_admin');
             }
             else{
                 $sdata['message']='Your User Id / Password Invalide !';
                 $this->session->set_userdata($sdata);
                 $this->load->view('admin/admin_login');
             }
          }
      
      
      for login and for logout
      
      
        public function logout()
          {
              $this->session->unset_userdata('full_name');
              $this->session->unset_userdata('admin_id');
              $sdata=array();
              $sdata['message']='You are Successfully Logout !';
              $this->session->set_userdata($sdata);
              redirect('admin');
      
      
      
          }
      

      【讨论】:

        【解决方案5】:

        这将在 http 或 localhost 中的登录页面然后 codeigniter 为 http 或 locahost 创建会话时发生。 当我们尝试在https://www.example.comhttp://[::1]/ 中获取会话时,不会为这些类型的网址添加会话..

        尝试在网站中使用一种类型的 url 模式

        【讨论】:

          【解决方案6】:

          用于删除 cookie

          delete_cookie('name', $domain, $path); 
          

          用于删除/销毁会话

          $this->session->sess_destroy();

          销毁特定会话

          $this->session->unset_userdata('name');
          

          对于多个项目

          $items = array('item-name1' => '', 'item-name2' => '');
          
          $this->session->unset_userdata($items);
          

          【讨论】:

            猜你喜欢
            • 2019-02-23
            • 2013-10-31
            • 2011-09-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多