2010-06-28 14 views
6

Estoy empezando a aprender sobre sesiones, y para mi propósito, quiero crear algo que cada vez que el cliente lo solicite, el servidor autentica a ese usuario y solo entonces realiza el manejo de datos para ese usuario.Ayuda de la sesión CodeIgniter, ¿las cookies no son seguras?

Sin embargo, he visto un montón de ejemplos con CodeIgniter, donde la sesión se configura como sigue:

$this->load->library('session'); 

$newdata = array(
       'username' => 'johndoe', 
       'email'  => '[email protected]', 
       'logged_in' => TRUE 
      ); 

$this->session->set_userdata($newdata); 

Sin embargo, no es posible que alguien acaba de crear una cookie en su ordenador con un nombre de usuario común y la el estado 'logged_in' es verdadero, y de repente estás autenticado sin una contraseña? Esto me parece una falla de seguridad, pero veo tantos ejemplos como este.

¿Cuál es la forma correcta de autenticar al usuario en cada solicitud?

+0

Preguntándose lo mismo: ¿por qué CI no solo usa sesiones de php y le proporciona algún tipo de interfaz CI-Ish? Es verdad que puedes usar la base de datos, pero ¿qué hay de malo en las sesiones "normales" en primer lugar? –

+1

La biblioteca de sesión de Codeigniter está ahí para hacer que las sesiones sean más flexibles, y eliminar el trabajo de las sesiones de manejo. Funciona muy bien y si almacena las sesiones en la base de datos se fuerza la validación de una ID de sesión única. Codeigniter maneja de forma transparente tanto la configuración como la verificación de la identificación de la sesión. Aquí hay una interfaz para las sesiones nativas de Codigniter: http://codeigniter.com/wiki/Native_session/ – DRL

+0

"Session" no significa "Cookie". La sesión solo existe en el servidor y fuera del alcance directo de un atacante. La Cookie solo contiene un sessionid, que es una cadena opaca y aleatoria. El servidor usa el sessionid para buscar el objeto de sesión para el usuario actual. En resumen, la cookie no contiene los nombres de usuario/email/logged_in flags, y por lo tanto un atacante no puede modificarlos directamente –

Respuesta

9

En el archivo application/config/config.php de su instalación de codigniter, puede optar por encriptar sus cookies.

$config['sess_cookie_name'] = 'ci_session'; 
$config['sess_expiration'] = 7200; 
$config['sess_encrypt_cookie'] = TRUE; // set from false to TRUE 

Una vez configurado el set_userdata() y los datos de usuario() métodos manejará de forma transparente cifrar y descifrar los datos de la sesión.

Una lista completa de opciones de configuración de sesión codigniter es en la parte inferior de esta página:

http://codeigniter.com/user_guide/libraries/sessions.html

+0

Muy bien, eso suena bien. Lo único que me pregunto es ¿es tan seguro como almacenar datos de sesión en una base de datos? Si alguien descifra el cifrado de cookies, ahora puede forjar una cookie para cualquier usuario (adivinar nombres de usuario) en lugar de simplemente acceder a la cuenta de un usuario. – Nick

+2

Si es una preocupación, ¿por qué no usa la base de datos para almacenar sesiones? De esta forma, puede validar los ID de sesión además de cifrar la cookie. Si le preocupa la seguridad, de hecho * debería * estar usando la base de datos. Consulte * Guardar datos de sesión en una base de datos * de la guía del usuario de CI: http://demos.softaculous.com/CodeIgniter/user_guide/libraries/sessions.html – stormdrain

2

Si desea mayor seguridad, se puede optar por los datos de sesión almacenar en la base de datos mediante la modificación del siguiendo las líneas dentro de su CodeIgniter config.php:

$config['sess_use_database'] = TRUE; 
$config['sess_table_name']  = 'ci_sessions'; 

Luego, basta con crear la siguiente tabla:

CREATE TABLE IF NOT EXISTS `ci_sessions` (
    session_id varchar(40) DEFAULT '0' NOT NULL, 
    ip_address varchar(16) DEFAULT '0' NOT NULL, 
    user_agent varchar(120) NOT NULL, 
    last_activity int(10) unsigned DEFAULT 0 NOT NULL, 
    user_data text NOT NULL, 
    PRIMARY KEY (session_id), 
    KEY `last_activity_idx` (`last_activity`) 
); 
+0

Una buena explicación aquí: http: // christopherickes.com/web-app-development/3-codeigniter-sessions-best-practices/que también sugiere cambiar: $ config ['sess_cookie_name'] = 'ci_session'; a $ config ['sess_cookie_name'] = 'cisession'; para compatibilidad con IE –

Cuestiones relacionadas