反序列化数据库会话Codeigniter
问题描述:
我确实遇到了Codeigniter数据库会话的问题。反序列化数据库会话Codeigniter
为了简短起见,我不想用相同的凭据(登录名/密码)进行多次登录。
第一次验证是通过数据库中的username/passwod匹配进行的。
这里是我的代码
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);
}
}
}
我知道我必须使用会话反序列化。我无法获得数组,但我不知道如何将数据与记录的用户进行比较。有人可以帮助我吗?
答
只需在会话表中添加另一列(如“user_id”),以便您可以使用单个简单的SQL查询来检查它。 unserialize()
(你需要它)通常是一个非常慢的函数,并检查会话表中的每一行可能成为一个问题。
但是......这里的笨是如何unserializes它的会话数据:
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);
}
}
你有可能会直接使用这些,如果他们不受保护,但是......您可能只是扩展会话库,而不是自行实施。
答
你可以尝试这样的事:
$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;
}
}
}
或作为替代你可能想使用一个饼干
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
}
精读:他们可以绕过这一点,如果他们试图通过新的计算机登录
注意:您可能需要设置您的过期时间,以配合您的会议时间,即:2小时(7200 )。
感谢您的帮助,但实际上我必须检测用户名是否在数组中,并且我不知道如何验证。 – 2012-01-14 06:25:59