2017-11-10 1 views
1

안녕하세요, 내 문제를 알려드립니다. PHP로 개발 된 응용 프로그램을 가지고 있으며, Codeigniter는 Wiroos에서 호스팅되는 웹에서 실행됩니다. 모든 것이 올바르게 작동했지만 시간이 지남에 따라 애플리케이션에 동시에 액세스하는 사용자가 더 많았으며 (다음) 문제가 발생하기 시작했습니다.다른 사용자의 세션에 대한 사용자 액세스

사용자 A가 위치 A에서 로그인하면 세션 A가 생성됩니다. 동시에 B 위치의 사용자 B가 응용 프로그램에 액세스하는 경우 사용자 A의 세션은 자동으로 위치 B에로드됩니다. 가능하면 가능합니까?

난 당신이 나에게

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($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 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> 내가 버전 3.0에 CodeIgniter를 마이그레이션, 심지어 내가/설정/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; 

응용 프로그램에서 다음과 같은 구성을 만들려고

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 

set_data_session 시도 할 다른 것을 알지 못한다면 서버 구성이 될 수 있다는 느낌이 들지만이 외의 지원에서 응답을받지 못했습니다.

Google 서버에는 nginx에서 관리하는 마이크로 캐시 계층이 있으며이 동작은 일 수 있습니다. 이제 도메인에 대해 비활성화했습니다. 다시 시도해주세요.

명백하게 문제가 지속됩니다. 나는 서로 다른 위치에있는 두 명의 서로 다른 사용자가 서버를 컨설팅 할 때 다른 서버의 세션에 액세스 할 수있는 방법을 이해하지 못합니다. 나는 네가 나를 도울 수 있기를 바란다, 고마워!

+0

'$ pass = md5 (...)'MD5 해시는 더 이상 안전하지 않으므로 'password_hash'를 사용하도록 변경해야한다고 생각합니다. http://php.net/manual/en/function.password-hash .php 또한 로그인 페이지에서이 모든 기능은 절반이 아닌 사용자 모델에 포함되어야합니다. – ArtisticPhoenix

+0

위 정보를 제공 할 수있는 최선의 코드를 검토했습니다. 이제는 침대가 있습니다. – ArtisticPhoenix

+0

Artistic Phoenix, 답장을 보내 주셔서 감사합니다! 나는 당신의 답을 시험해 보려고 노력할 것이지만, 문제는 아마도 로그인 논리가 아니라 세션 일 것이다. 가능한 빨리 회신을 드리겠습니다 – Microsource

답변

0

답장을 보내 주셔서 감사합니다. 문제는 NGINX에서 관리하는 마이크로 캐시 계층입니다. 내 호스팅 지원이 사용 중지되었으며 모든 기능이 정상적으로 작동합니다.

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

CI 당신이 중 하나 FALSE를 사용하는 경우가 확인되지있어 문제가있는 경우 데이터가 그렇게 $_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

사용자 테이블에 대해 DB 필드에 설정 한 제약 조건을 알지 못하면이를 알 수 없습니다. 그러나 적절한 제약이 없다면 비밀번호 찾기가 여러 개인 사용자가 false이고 false (적어도 로그인 코드에 따라) 이메일 조회가 가능하여 데이터베이스 조회로 전달되어 여러 결과가 표시 될 수 있습니다 .

확실히 알 수있는 유일한 방법은 사용자 테이블에서 PhpMyAdmin을보고 거기에 중복 된 암호와 전자 메일이 있는지 확인하는 것입니다.

또한 여러 명의 사용자와 일치하여 로그인을 1 계정으로 제한하지 않습니다. 코드의이 부분을 고려하십시오.

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

여기서 루프는 하나 이상의 반환 레코드가 필요하다는 것을 의미합니다. 1 명 이상의 사용자가 반환되면 오류가 발생합니다. 이메일은 고유해야하며 이메일로 사용자를 찾을 때 두 명 이상의 사용자가 반환되지 않아야합니다. (다시 생각할 수있는 사용자 모델의 구현을 보지 않고). 하지만 당신은 명시 적으로 다음과 같이 확인한다 : 당신이 거기있는 루프 일어날 수

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)"입니다.이 추측은 로그인 할 때 느슨한 제약을 볼 수 있습니다. 로그인은 응용 프로그램의 게이트웨이이며 훨씬 더 엄격하게 버튼을 눌러야합니다.

추신. 나는 Google 번역을 사용했기 때문에 모든 것을 올바르게 읽길 바랍니다.

관련 문제