Codeigniter: caducidad de la sesión y función “recordarme”

Estoy creando una función “Recordarme” en Codeigniter, normalmente veo bibliotecas / proyectos que configuran una cookie en el usuario con un token, este token se guarda en la base de datos y se compara cada vez que el usuario accede al sitio web.

Sin embargo, en Codeigniter podemos establecer el tiempo de expiración de la sesión, esto me lleva a probar un enfoque diferente, esto es lo que hice:

  • Puse la session_expiration en config a 0 (sesión infinita)
  • Si el usuario deja “Recordarme” sin marcar, establezco un tiempo de 2 horas en la sesión y la sesión se destruye al cerrar la ventana.

Así que mi código de inicio de sesión se ve así:

if (!$this->input->post('remember_me')) { $this->session->sess_expiration = 7200; $this->session->sess_expire_on_close = TRUE; } $this->session->set_userdata($session_data); 

Y mi archivo de configuración:

 $config['sess_expiration'] = 0; $config['sess_expire_on_close'] = FALSE; 

No veo que la gente use esta solución en proyectos, lo he probado y parece que funciona bien.

Entonces, para mi pregunta, ¿diría que es una práctica segura? ¿Hay algún peligro de seguridad que deba conocer? Cualquier entrada en esta solución vs cookie + token de base de datos sería genial.

La solución más sencilla que he encontrado para este problema es simplemente modificar la cookie creada por Codeigniter de esta manera:

  $this->session->set_userdata('user', $user); // a cookie has been created if($this->input->post('remember_me')) { $this->load->helper('cookie'); $cookie = $this->input->cookie('ci_session'); // we get the cookie $this->input->set_cookie('ci_session', $cookie, '35580000'); // and add one year to it's expiration } 

También esto se puede hacer editando / extendiendo la biblioteca de sesión del sistema.

Primero: Establecer el tiempo de expiración de la sesión regular en el archivo de configuración. En segundo lugar: en la función de inicio de sesión de usuario, agregarme

  if($remember) { $data['new_expiration'] = 60*60*24*30;//30 days $this->session->sess_expiration = $data['new_expiration']; } $this->session->set_userdata($data); 

Tercero: edite la biblioteca de la sesión del sistema [No estoy seguro de si la extensión de la sesión funcionará o no] Vaya a esta línea con el método sess_read()

 if (($session['last_activity'] + $this->sess_expiration) < $this->now) 

Antes de esa línea agregue el siguiente código

 if(isset($session['new_expiration'])){ $this->sess_expiration = $session['new_expiration']; } 

Esto funciona bien para mi.

No puedo decir que no esté bien, pero puedo decirte mi manera de hacer esto:

Primero, configuro la sesión para que caduque en el cierre del navegador con un tiempo de actividad predeterminado de 7200.

Entonces:

  1. El inicio de sesión establece los datos de usuario de la sesión.

  2. El “recuerdame” establece una cookie separada (almaceno un hash cifrado que contiene el correo electrónico + contraseña + identificación del usuario, es decir: md5 (pase + correo electrónico + ID))

Cada vez que el usuario carga una página, controlo si existe la cookie “Recordarme”, si existe, creo la sesión del usuario.

Lo único que sé es que la sesión utiliza una clave de cifrado; un atacante malicioso tardará un tiempo en descifrar, por lo que cuanto menos clave de sesión exista, menos tiempo tendrá el atacante para descifrar la clave actual.

Siempre evito que la sesión no caduque, por lo que Recordarme, siempre es algo que no es bueno para la seguridad, creo que, de todos modos, el usuario debe elegir o no si desea usar esa función;)