用户访问另一个用户的会话

时间:2017-11-10 11:23:59

标签: php apache codeigniter session nginx

晚上好,我告诉你我的问题。我有一个用PHP开发的应用程序,在Wiroos的Web主机上运行Codeigniter。一切都正常,但随着时间的推移,应用程序有更多的用户同时访问(显然),并开始出现以下问题。

当用户A从位置A登录时,会生成会话A.如果同时来自位置B的用户B访问该应用程序,则用户A的会话将自动加载到其位置B ......因为它可以这样吗?

我向您展示我的申请代码,看看您是否可以帮助我

登录控制器

public function index($estadoLogin = 0){

if($this->session->userdata('estado_sesion'))
{
    redirect(base_url()."panel");
}
$data['estadoLogin'] = $estadoLogin;
$data['title'] = "Iniciar Sesión - LandingApp";
$data['bodyClass'] = "external-page sb-l-c sb-r-c";

$this->load->view('templates/header',$data);        
$this->load->view('login/loginbox', $data);

}//End method index

登录方式

public function ingresar(){
$correo = $this->security->xss_clean(strip_tags($this->input->post('correo')));
$pass = md5($this->security->xss_clean(strip_tags($this->input->post('password'))));

$Usuarios = new Usuario_Model();
$result = $Usuarios->login($correo, $pass);
if(count($result)>0){
    foreach($result as $u){
        $this->session->unset_userdata('id');
        $this->session->unset_userdata('mail');
        $this->session->unset_userdata('nombre');
        $this->session->unset_userdata('activo');
        $this->session->unset_userdata('logo_empresa');
        $this->session->unset_userdata('nombre_empresa');
        $this->session->unset_userdata('id_empresa');
        $this->session->unset_userdata('nivel');
        $this->session->unset_userdata('estado_sesion');

        $this->session->set_userdata('id', $u->id);
        $this->session->set_userdata('mail', $u->mail);
        $this->session->set_userdata('nombre', $u->nombre);
        $this->session->set_userdata('activo', $u->activo);
        $this->session->set_userdata('nivel', $u->nivel);
        $this->session->set_userdata('nombre_empresa', $u->nombre_empresa);
        $this->session->set_userdata('id_empresa', $u->id_empresa);
        $this->session->set_userdata('logo_empresa', $u->logo_empresa);
        $this->session->set_userdata('avatar_user', $u->avatar_user);
        $this->session->set_userdata('estado_sesion', TRUE);

        redirect(base_url()."panel");

    }//End foreach


}else{
    $this->session->set_flashdata('mensaje', 'El usuario o password es incorrecto');
    redirect(base_url()."login/index/1");
    //$this->index(1);
}//End if

面板控制器

public function index(){


$id = $this->session->userdata('id');
$id_empresa = $this->session->userdata('id_empresa');

$data_session['title'] = "Panel General";
$data_session['opcionMenu'] = "panel";
$data_session['bodyClass'] = "dashboard-page";

$data_session = $this->session_data_lib->set_data_session($data_session); //cargo las variables de sesion

if ($data_session['nivel']==1 || $data_session['nivel']==2){

    $data_counters = $this->counters_lib->get_admin_counters(); //cargo las variables de contadores

}else{
    $data_counters = $this->counters_lib->get_user_counters(); //cargo las variables de contadores
}

$this->load->view('templates/header', $data_session);
$this->load->view('templates/menu_top', $data_session);
$this->load->view('templates/menu_left', $data_counters);
if ($data_session['nivel']==0) {
    $this->load->view('panel/panel_user',$data_counters);
}else{
    $this->load->view('panel/panel_admin',$data_counters);
}

$this->load->view('templates/footer',$data_counters);

}//End method index

Session_Data_lib> set_data_session

public function set_data_session($data_session){
$data_lib_session['title'] = $data_session['title'];
$data_lib_session['opcionMenu'] = $data_session['opcionMenu'];
$data_lib_session['bodyClass'] = $data_session['bodyClass']; 
$data_lib_session['nombre'] = $this->CI->session->userdata('nombre');
$data_lib_session['userid'] = $this->CI->session->userdata('id');
$data_lib_session['nivel'] = $this->CI->session->userdata('nivel');   
$data_lib_session['avatar_user'] = $this->CI->session->userdata('avatar_user');
$data_lib_session['logo_empresa'] = $this->CI->session->userdata('logo_empresa');
$data_lib_session['nombre_empresa'] = $this->CI->session->userdata('nombre_empresa');
$data_lib_session['id_empresa'] = $this->CI->session->userdata('id_empresa');
$data_lib_session['arr_css'] = array("absolute_admin/assets/fonts/iconsweets/iconsweets.css");
$data_lib_session['lastSegs'] = $this->CI->panel_model->get10LastSeg($this->CI->session->userdata('id_empresa'));

return $data_lib_session;
}//End method set_data_session

我尝试将Codeigniter迁移到3.0版,甚至在application / config / config.php中进行以下配置

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_sessions';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

我不知道还有什么可以尝试,我觉得它可以是服务器配置,但除此之外我仍然没有得到支持的回复:

  

我们的服务器有一个由nginx管理的微缓存层   导致此行为,现在我为您的域停用了它。您可以...吗   请再试一次?

显然问题仍然存在。我不明白来自不同位置的两个不同用户在咨询服务器时如何能够访问另一个用户的会话。我希望你能帮助我,谢谢!

2 个答案:

答案 0 :(得分:0)

正如我在评论中所说,您应该更新密码以使用PHP hash_password代替md5

我无法说这是您的问题,但您应该验证您的用户表中没有重复数据。这段代码

public function ingresar(){
   $correo = $this->security->xss_clean(strip_tags($this->input->post('correo')));
   $pass = md5($this->security->xss_clean(strip_tags($this->input->post('password'))));

特别是

$this->input->post('correo')
如果FALSE中没有设置数据,则

CI可以返回$_POST,因此如果您遇到问题,则不会检查是否正在使用FALSE或密码和电子邮件。你应该像这样检查,例如

public function ingresar(){
  if(!$this->input->post('correo'))
       //throw an error - stop execution, etc.
  if(!$this->input->post('password'))
       //throw an error - stop execution, etc.

  /* ...continue on if both inputs are valid ... */

如果您的数据库中没有设置唯一字段,则可能会有数十个具有相同密码和电子邮件的重复用户。两者都设置为false

在不知道您为用户表的数据库字段设置了哪些约束的情况下,我无法告诉您。但是,如果您没有适当的约束,那么可能有多个用户的密码为false,电子邮件为false(至少根据您的登录代码)将传递到您的数据库查找并拉出多个结果。

唯一可以确定的方法是在您的用户表中查看PhpMyAdmin,看看您是否有重复的密码和电子邮件。

与多个用户一致,您不仅限制登录1个帐户。考虑一下代码的这一部分。

public function ingresar(){
    /* ..... */
    if(count($result)>0){  //should expect only one user returned.
        foreach($result as $u){

这里的循环意味着我们期待一个或多个返回记录。如果返回的用户超过1,则会抛出错误。电子邮件应该是唯一的,我们不应该在通过他的电子邮件查找用户时返回2个或更多用户。 (再次没有看到你的用户模型的实现我只能猜测)。但你应该明确地检查这样:

public function ingresar(){
    /* ..... */
    if(count($result)==1){ 
     //log user in
    }else if(count($result)>1){
       //this should never happen but it is, so you should pay attention here
    }else{
       //user not found or wrong password.
    }

在那里循环可能发生的事情是,会话数据将被覆盖,直到最后一个重复记录。所以每个人都有一个“不好的”。帐户作为错误电子邮件数据提取的最后一条记录登录。

总而言之,我会说有很多"漏洞"在您的代码中,可以允许在适当的条件下发生这种情况。其中大部分是" Guesses"根据我所看到的,你已经有了适当的登录限制。登录是您的应用程序的网关,应该比这更紧凑。

PS。我使用谷歌翻译,所以我希望我能正确阅读所有内容。

答案 1 :(得分:0)

感谢您的回复。问题是由NGINX管理的微缓存层。我的托管支持禁用了,一切正常!