取消数据库会话代码点火器的序列化


Unserialize Database Session Codeigniter

我确实对Codeigniter数据库会话有问题。

简而言之,我不希望使用相同凭据(登录名/密码)进行多次登录。

第一次验证是通过数据库中的用户名/密码匹配进行的。

这是我的代码

function index()
{
    // Load Model.
    $this->load->model('membres_model');
    // Check if the user is already logged
    if($this->session->userdata('alias') || $this->session->userdata('logged'))
    {
        //Redirect if he is logged.
        redirect('membres/');
    }
    // If the form has been sent.   
    if($this->input->post('submit'))
    {           
        // Trim data
        $this->form_validation->set_rules('alias','Nom d''utilisateur','trim|required|xss_clean');
        $this->form_validation->set_rules('motdepasse','Mot de passe','trim|required|xss_clean');
        if($this->form_validation->run())
        {
            // check verification in the model
            if($this->membres_model->verification_connexion($this->input->post('alias'),$this->input->post('motdepasse')))
            {
                // Set userdata variables
                $data = array(
                    'alias'     =>  $this->input->post('alias'),
                    'addr_ip'   =>  $_SERVER['REMOTE_ADDR'],
                    'hote'      =>  gethostbyaddr($_SERVER['REMOTE_ADDR']),
                    'logged'    =>  true
                );
                    /****************************************
                    I Want to verify if the membres is already logged if another one want to use the                        same login/password of the logged on. but I don't know how to verify in the                         ci_sessions
                    *****************************************/
                    // start session
                    $this->session->set_userdata($data);
                    // Redirection sur l'espace membre apres la creation de la session.
                    redirect('membres/');
            }
            else {
                // if return false
                $data['error'] = 'Mauvais identifiants';
                $data['contenu'] = 'connexion/formulaire';
                $this->load->view('includes/template',$data);
            }
        } 
        else {
            $data['contenu'] = 'connexion/formulaire'; // La variable vue pour loader dans le template.
            $this->load->view('includes/template',$data);
        }
    } 
    else {
        $data['contenu'] = 'connexion/formulaire'; // La variable vue pour loader dans le template.
        $this->load->view('includes/template',$data);
    }
}
}

我知道我必须使用会话Unserialize。我无法获取数组,但我不知道如何将数据与记录的用户进行比较。有人能帮我吗?

只需在sessions表中添加另一列(比如"user_id"),就可以使用一个简单的SQL查询进行检查。unserialize()(您需要它)通常是一个非常慢的函数,检查会话表中的每一行可能会成为一个问题。

但是。。。以下是CodeIgniter如何取消其会话数据的序列化:

    protected function _unserialize($data)
    {
            $data = @unserialize(strip_slashes($data));
            if (is_array($data))
            {
                    array_walk_recursive($data, array(&$this, '_unescape_slashes'));
                    return $data;
            }
            return (is_string($data)) ? str_replace('{{slash}}', '''', $data) : $data;
    }

这里有一个叫

    protected function _unescape_slashes(&$val, $key)
    {
            if (is_string($val))
            {
                    $val= str_replace('{{slash}}', '''', $val);
            }
    }

如果它们没有得到保护,你本可以直接使用它们,但是。。。最好还是扩展Session库,而不是自己实现它。

你可以试试这样的东西:

$sessions = "SELECT * FROM ci_sessions"; // return as object
        foreach($sessions as $sess)
        {
            foreach(unserialize($sess->user_data) as $k => $v)
            {
                if($k === 'alias' AND isset($v))
                {
                    return true;
                }
            }
        }

或者,您可能希望使用cookie

public function _before_check($alias) // alias should have UNIQUE constraint
{
    return ($this->input->cookie('my_cookie_'.$alias, TRUE)) ? TRUE : FALSE;
}

在您的表单验证中,请先进行检查!

if($this->_before_check($alias))
{
   //already logged In
}
else
{
  //log them in AND set your cookie
}

Con:如果他们试图通过新计算机登录,他们可以绕过这一点

注意:您可能需要将过期时间设置为与会话时间相匹配,即:2小时(7200)。