Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Ethgar en 10 Marzo 2015, 17:39 pm



Título: manda de nuevo los post del formulario al ir atras en el navegador y actualizar
Publicado por: Ethgar en 10 Marzo 2015, 17:39 pm
Que tal, buenos días, me tope con un problema, tengo un login en una aplicación y se logea correctamente y cuando hago el logout también, borra la sesión, el problema es que cuando hago el logout y vuelvo a la pagina anterior me aparecen los datos del usuario logeado, y al refrescar la pagina me aparece que si deseo confirmar el envío de los datos del formulario, lo que hace que se vuelva a logear. de que manera podria controlar este problema?


Título: Re: manda de nuevo los post del formulario al ir atras en el navegador y actualizar
Publicado por: Usuario Invitado en 10 Marzo 2015, 18:15 pm
No sé mucho de PHP, pero ¿porqué no pones en tu controlador frontal que se redirija a login.php cuando no haya sesión?

Código
  1. <?php
  2.      if(!isset($_SESSION['logged_in']))
  3.          header("Location: login.php");
  4. ?>

Y en el logout, remueves la sesión y la destruyes:

Código
  1. <?php
  2.      unset($_SESSION['logged_in']);  
  3.      session_destroy();  
  4. ?>


Título: Re: manda de nuevo los post del formulario al ir atras en el navegador y actualizar
Publicado por: MinusFour en 10 Marzo 2015, 18:32 pm
¿Estas utilizando cookies simplemente?


Título: Re: manda de nuevo los post del formulario al ir atras en el navegador y actualizar
Publicado por: Ethgar en 10 Marzo 2015, 18:37 pm
MinusFour  estoy utilizando la clase session de CodeIgniter, Gus Garsaky  la session si la destruyo en un controlador llamado logout que me lleva a el login, el problema es que cuand hago logout si me manda al login pero si yo voy a atrás en el navegador puedo llegar a una pagina en la que estuve logeado, y si refresco la pagina manda los datos del formulario , intente destruir las variables post pero aun así lo vuelve a mandar


Título: Re: manda de nuevo los post del formulario al ir atras en el navegador y actualizar
Publicado por: MinusFour en 10 Marzo 2015, 19:03 pm
MinusFour  estoy utilizando la clase session de CodeIgniter, Gus Garsaky  la session si la destruyo en un controlador llamado logout que me lleva a el login, el problema es que cuand hago logout si me manda al login pero si yo voy a atrás en el navegador puedo llegar a una pagina en la que estuve logeado, y si refresco la pagina manda los datos del formulario , intente destruir las variables post pero aun así lo vuelve a mandar

¿No puedes poner tu código? Si estas destruyendo la sesion propiamente entonces no deberia llevar acabo la funcion normal del script, porque el dato de la sesion no existe.


Título: Re: manda de nuevo los post del formulario al ir atras en el navegador y actualizar
Publicado por: Ethgar en 10 Marzo 2015, 19:48 pm
Este es el formulario de login:


Código:
echo form_open('main/login',$form_login);
echo form_label('usuario','usuario');
echo form_input($campo1);
echo form_label('password','password');
echo form_input($campo2);
echo '<br>'.form_input($enviar);
echo form_close();

Este es mi controlador login
Código:
public function login(){
$usuario = $this->input->post('usuario', TRUE);
$password = $this->input->post('password', TRUE); 
$data['res'] = $this->usuarios_model->verTodo();
$this->usuarios_model->login($usuario,$password);
$this->load->view('header',$data);
$this->load->view('verdata');
$this->load->view('footer');
}

Y este mi controlador logout
Código:
public function logout(){
$form_login['form_login'] = array(
'name' => 'login',
'id' => 'login',
'rol' => 'form'
);
$this->session->sess_destroy();
$data['res'] = $this->usuarios_model->verTodo();
$this->load->view('header',$data);
$this->load->view('login',$form_login);
$this->load->view('footer');
}


Título: Re: manda de nuevo los post del formulario al ir atras en el navegador y actualizar
Publicado por: MinusFour en 10 Marzo 2015, 21:52 pm
Este es el formulario de login:


Código:
echo form_open('main/login',$form_login);
echo form_label('usuario','usuario');
echo form_input($campo1);
echo form_label('password','password');
echo form_input($campo2);
echo '<br>'.form_input($enviar);
echo form_close();

Este es mi controlador login
Código:
public function login(){
$usuario = $this->input->post('usuario', TRUE);
$password = $this->input->post('password', TRUE); 
$data['res'] = $this->usuarios_model->verTodo();
$this->usuarios_model->login($usuario,$password);
$this->load->view('header',$data);
$this->load->view('verdata');
$this->load->view('footer');
}

Y este mi controlador logout
Código:
public function logout(){
$form_login['form_login'] = array(
'name' => 'login',
'id' => 'login',
'rol' => 'form'
);
$this->session->sess_destroy();
$data['res'] = $this->usuarios_model->verTodo();
$this->load->view('header',$data);
$this->load->view('login',$form_login);
$this->load->view('footer');
}

No uso CodeIgniter pero no veo en ningun lugar que estes agregando informacion acerca de la sesion, por lo que cuando destruyes la sesion no debe tener ninguna informacion relevante. ¿CodeIgniter no tiene modulos para manejar la autentificacion?


Título: Re: manda de nuevo los post del formulario al ir atras en el navegador y actualizar
Publicado por: Ethgar en 11 Marzo 2015, 02:42 am
La agrego en el modelo cuando hace la consulta:
Código:
public function login($usuario,$password){//
$this->db->where('USUARIO',$usuario);
$this->db->from('usuarios');
$consulta = $this->db->get();
if ($consulta->num_rows > 0) {
$this->db->where('PASSWORD',$password);
$this->db->from('usuarios');
$consulta1 = $this->db->get();
if ($consulta1->num_rows > 0) {
$consulta = $consulta->row();
$data = array(
'NOMBRE' => $consulta->NOMBRE,
'APELLIDOS' => $consulta->APELLIDOS,
'USUARIO' => $consulta->USUARIO,
'TIPO_USUARIO' => $consulta->TIPO_USUARIO
);
$this->session->set_userdata($data);
}else{
$this->session->set_flashdata('Mensaje:',"Contraseña incorrecta");
$this->session->keep_set_flashdata('Mensaje:',"Contraseña incorrecta");
}

}else{
$this->session->set_flashdata('Mensaje:',"usuario incorrecto");
}

}


Título: Re: manda de nuevo los post del formulario al ir atras en el navegador y actualizar
Publicado por: MinusFour en 11 Marzo 2015, 03:17 am
Bueno entonces creo que tiene que ver con la forma en que tu navegador envia la peticion HTTP. Estoy leyendo la especificacion de CodeIgniter y ellos no manejan sesiones de PHP, tienen su propia implementacion basada en cookies, la cual parece ser que es simplemente una serializacion de un arreglo que es guardado en la cookie en si y no del lado del servidor (a menos que uses una base de datos para las sesiones).

No tengo idea si hacen control de las session_ids, pero es posible que estes enviando la cookie de nuevo (con todos los valores asociados) y CodeIgniter no haga un control propio sobre las ids. ¿Estas utilizando el contenido de estas sesiones en cada uno de los controladores? Por ejemplo, en las paginas que vuelves a reenviar la informacion POST y ves toda la informacion del usuario una vez deslogueado.... usas:

Código
  1. $this->session->userdata('USUARIO');


Título: Re: manda de nuevo los post del formulario al ir atras en el navegador y actualizar
Publicado por: Ethgar en 11 Marzo 2015, 03:43 am
Así es, lamo el array de sesiones para verificar si hay uno logueado, tienes razón en que al regresar la pagina vuelve el array de la cokie, creo que debo enfocarme por ese lado, gracias por tus respuestas, en cuanto quede resuelto publico la solución, saludos!!!


Título: Re: manda de nuevo los post del formulario al ir atras en el navegador y actualizar
Publicado por: Ethgar en 11 Marzo 2015, 16:10 pm
Resolví el problema, era algo muy sencillo, lo que hacia anteriormente era que mi formulario mandaba los datos, el controlador login los procesaba y los mandaba verificar a la tabla al modelo login y el mismo controlador login direccionaba a una pagina de bienvenida, lo que ice fue en el mismo archivo login puse el mensaje de bienvenida, en caso de encontrar una session activa, de no ser así mostraba de nuevo el formulario login, lo que supongo que pasaba anteriormente es que al dirigir a un archivo aparte de bienvenida quedaban los datos del formulario ahí, ahora solo quedan en el controlador, pero como solo redirige no manda los datos al archivo, espero darme a entender, de todas maneras les dejo el código corregido, espero les sea de ayuda por si alguno andaba batallando con lo mismo.

vista login:
Código
  1. if (!$this->session->userdata('NOMBRE')) {
  2.   echo form_open('main/login',$form_login);
  3.   echo form_label('usuario','usuario');
  4.   echo form_input($campo1);
  5.   echo form_label('password','password');
  6.   echo form_input($campo2);
  7.   echo '<br>'.form_input($enviar);
  8.   echo form_close();
  9.   //Si el Usuario o contraseña son incorrectos muestra un alert! (Bootstrap).
  10.   <?php if ($this->session->flashdata('mensaje')): ?>
  11.     <p class="alert alert-danger"><?php echo $this->session->flashdata('mensaje'); ?></p>
  12.   <?php endif ?>
  13. }else{
  14. echo 'Bienvenido, Usuario '.$this->session->userdata('USUARIO').';
  15. }
  16.  

Controlador login:
Código
  1. public function login(){
  2.  $usuario    = $this->input->post('usuario', TRUE);
  3.  $password   = $this->input->post('password', TRUE);
  4.  $this->usuarios_model->login($usuario,$password);
  5.  redirect(base_url());  //Aquí es donde redirecciono al formulario o pagina principal la cual tiene el form
  6. }

Modelo Login:
Código
  1. public function login($usuario,$password){//
  2.  $this->db->where('USUARIO',$usuario);
  3.  $this->db->from('usuarios');
  4.  $consulta = $this->db->get();
  5.  if ($consulta->num_rows > 0) {//Si obtenemos resultados de la consulta
  6.        $this->db->where('USUARIO',$usuario)->where('PASSWORD',$password);
  7. $this->db->from('usuarios');
  8. $consulta1 = $this->db->get();
  9. if ($consulta1->num_rows > 0) {//si obtenemos resultados de la consulta
  10. $consulta = $consulta->row();
  11. $data = array(
  12. 'NOMBRE' => $consulta->NOMBRE,
  13. 'APELLIDOS' => $consulta->APELLIDOS,
  14. 'USUARIO' => $consulta->USUARIO,
  15. 'TIPO_USUARIO' => $consulta->TIPO_USUARIO
  16. );
  17. $this->session->set_userdata($data);
  18. }else{
  19. $this->session->set_flashdata('mensaje',"Contraseña incorrecta");
  20. }
  21.  
  22. }else{
  23. $this->session->set_flashdata('mensaje',"usuario incorrecto");
  24. }
  25.  
  26. }
  27.  

Mod: tema modifica con etiqeutas GeSHi para que sea más legible... un post borrado,no hacer doble post