php - start - this-> input-> set_cookie
¿Cómo sabe CodeIgniter que una cookie contiene datos de sesión válidos? (5)
En CodeIgniter, los datos de la sesión se guardan en una cookie de forma predeterminada. Pero también debe haber un archivo en mi servidor (llamado ID de la sesión) para verificar que los datos (en la cookie) sean válidos, ¿o estoy equivocado?
Estoy buscando la ubicación donde se guardan las sesiones. Ya he buscado en el directorio "session.save_path" (/ var / lib / php5), pero en este directorio solo hay otras sesiones, pero no las de CodeIgniter.
Tampoco guardo las sesiones en la base de datos, ¿cómo sabe CodeIgniter que los datos (en la cookie) son válidos?
Acabo de probar esto hoy con Firebug ...
Para realizar un seguimiento de la respuesta de Shanee, en el archivo "application / config / config.php" de CodeIgniter, si se establece:
$config[''sess_use_database''] = TRUE;
entonces solo los datos de sesión de CI predeterminados: session_id, IP_address .., se almacenan como una cookie de navegador.
Cualquier información personalizada adicional proporcionada por la función set_userdata()
, como nombres de usuario y contraseñas, ya no forma parte de la cookie, sino que se almacena en su base de datos.
Cuando hablo de "sesiones" a continuación, me refiero a sesiones CI, no sesiones PHP.
Si usa la opción predeterminada (que el manual dice que no debe usarse para datos confidenciales), la respuesta a su pregunta es que no sabe. Confía en la cookie.
Para usarlo de la manera segura diseñada, debe usar la opción de sesión de la base de datos, así como la opción de encriptación. Usando ambas opciones, esta es la respuesta a su pregunta:
Solo un valor se almacena en la cookie. Ese valor es una matriz serializada y encriptada. Esa matriz contiene cuatro piezas de información.
- ''session_id'', => hash aleatorio
- ''ip_address'' => ''cadena - dirección IP del usuario''
- ''user_agent'' => ''string - datos del agente de usuario''
- ''last_activity'' => timestamp
La ID de sesión es una cadena aleatoria. Esta es la cadena que se usa para correlacionar con los datos en la tabla de sesión. La cadena se regenera (y vuelve a cifrar) cada solicitud y se actualiza en la cookie y la tabla. Si esto no coincide con el valor de la tabla de sesión, los datos de la tabla son inaccesibles y quedarán atrapados en la recolección de basura incorporada.
Opcionalmente, también puede exigir la comprobación de IP en la clase de sesión de CI. Esto significa que, además de una identificación de sesión de regeneración aleatoria, la IP de los usuarios también debe permanecer constante o la sesión se destruirá.
Opcionalmente, también puede aplicar la verificación UA y un valor de tiempo de espera excedido.
Por lo tanto, un archivo de sesión tradicional nunca se escribe en una carpeta de caché. Las sesiones de CI Cookie no tienen ningún valor para todos los datos, excepto los no personales, como recordar los estados de IU de una interfaz web. Las sesiones de la Base de datos de CI son muy flexibles. Si su instalación de PHP incluye Mcrypt, la seguridad también es sólida. Si no tiene Mcrypt, todavía son razonablemente seguros, pero no aprobarían, por ejemplo, el cumplimiento de PCI.
Puede leer más en el manual de CI , pero este fue un resumen de la información que creí más relevante para su pregunta.
Esto no responde directamente a su pregunta, pero pensé que podría ser útil saberlo.
Use lo siguiente para ver la sesión de PHP.
print_r ($_SESSION);
Use lo siguiente para ver la sesión de CI.
print_r ($this->session->userdata);
La cookie contiene un hash md5 de los datos de la sesión y la clave de cifrado de la cookie que se verifica al cargar los datos, consulte system / libraries / Session.php, function sess_read () líneas 140ff:
// Decrypt the cookie data
if ($this->sess_encrypt_cookie == TRUE)
{
$session = $this->CI->encrypt->decode($session);
}
else
{
// encryption was not used, so we need to check the md5 hash
$hash = substr($session, strlen($session)-32); // get last 32 chars
$session = substr($session, 0, strlen($session)-32);
// Does the md5 hash match? This is to prevent manipulation of session data in userspace
if ($hash !== md5($session.$this->encryption_key))
{
log_message(''error'', ''The session cookie data did not match what was expected. This could be a possible hacking attempt.'');
$this->sess_destroy();
return FALSE;
}
}
La instalación del codeignador nativo anula el manejo habitual de la sesión PHP y utiliza su propio sistema de manejo de datos, que es la razón por la que no puede encontrarlo en los lugares normales. (También mencionaría que personalmente encuentro que la forma en que se implementó es un poco insegura ya que TODOS los datos de la sesión se almacenan directamente en la cookie de sesión del navegador de los usuarios).
Puede hacer lo que Residuum ha sugerido y retroceder a través de la biblioteca de sesión codeigniter y encontrar dónde se está almacenando, o puede anular el manejo de sesión con algo como OB_Session. ( http://bleakview.orgfree.com/obsession/ )
Le sugiero encarecidamente que instale OB_Session o algo similar, ya que utilizará el manejo de la sesión PHP nativa y mantendrá sus cookies ya sea de A) demasiado grandes y chocando contra el límite de bytes del navegador, o B) permitiendo al usuario sensible datos que se almacenarán en el lado del cliente.
Finalmente, dependiendo de lo que esté tratando de hacer, seguiría las instrucciones de la guía del usuario de CI y almacenaría los datos de la sesión en la base de datos. ( http://codeigniter.com/user_guide/libraries/sessions.html ) Esto facilitará mucho el trabajo con los datos e incluso actualizará y ampliará lo almacenado por Codeigniter. Sin embargo, tenga en cuenta que, incluso si lo almacena en la base de datos, TODAVÍA tiene que cambiar a algo como OB_Session, ya que su cookie aún contiene todos los datos, incluso cuando se cambia a la base de datos.