会话不会在codeigniter中被破坏

时间:2017-04-15 08:23:17

标签: php codeigniter session cookies

我正在尝试取消设置我当前登录用户的会话。如果我正常登录但工作正常,但是当我使用时记住我使用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());
}

我在做错的地方。请帮忙。感谢

6 个答案:

答案 0 :(得分:3)

首先,你的记忆机制存在严重缺陷。请参阅Implementing Secure User Authentication in PHP Applications with Long-Term Persistence

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

$_SESSION['username']
OR
$this->session->userdata('username')
OR
$this->session->username

最后,通过在网络标签中检查您的请求,确保实际删除了Cookie。 Codeigniter通过设置大约一天的负过期时间来删除cookie,看看您的Codeigniter版本是否属于这种情况。为了获得最佳效果,只需使用较长的负过期时间再次设置Cookie,而不是检查Cookie是否已设置,请检查Cookie是否为!empty

答案 1 :(得分:1)

  1. 要从会话数组中取消设置单个元素:

    $这 - >会话而> unset_userdata( 'some_name');

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

    $ array_items = array('username'=>'','email'=>''); $这 - >会话而> unset_userdata($ array_items);

答案 2 :(得分:1)

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



    }

答案 3 :(得分:1)

我前段时间遇到过同样的问题。我正在尝试所有可行的方法。但我失败了。最后,我找到了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?

  

答案 4 :(得分:1)

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

尝试在网站中使用一种类型的网址格式

答案 5 :(得分:0)

删除cookie

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

删除/销毁塞语

$这 - &GT;会话而&GT; sess_destroy();

销毁特定会话

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

对于多个项目

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

$this->session->unset_userdata($items);
相关问题