Dónde se almacenan las sesiones de php. Sesiones PHP bajo el bisturí
Hay miles de tutoriales en Internet sobre qué son las sesiones, para qué sirven y cómo trabajar con ellas. Pero, lamentablemente, después de leerlos, aún quedan muchas preguntas. En mi opinión, la forma más sencilla de entenderlo todo es ver cómo funcionan las sesiones desde dentro. Aquellos. examinar los registros de intercambio del navegador y el servidor web, y también ver qué datos se almacenan en el lado del cliente y del servidor.
Después de eso, muchos puntos se vuelven mucho más comprensibles y el mecanismo de operación en sí se vuelve más transparente.
Estudiaremos el trabajo de las sesiones utilizando el siguiente guión estándar:
Funciona así:
Bloque 1. La función session_start () crea una nueva sesión o carga una antigua usando el identificador de sesión único PHPSESSID.
Bloque 2. Si se restauró la sesión, se incrementa el valor de $ _SESSION ["vistas"]. Si no es así, se inicializa a uno.
En teoría, si la compatibilidad con cookies está habilitada en el navegador, el mecanismo debería funcionar y cada vez que se actualice la página, el valor del contador aumentará en uno.
Primera carga del guion
Solicitar encabezados
GET / HTTP / 1.1 Host: firingrange.local Usuario-Agente: Mozilla / 5.0 (Windows NT 5.1; rv: 6.0.2) Gecko / 20100101 Firefox / 6.0.2 Aceptar: texto / html, aplicación / xhtml + xml, aplicación / xml; q = 0.9, * / *; q = 0.8 Accept-Language: ru-ru, ru; q = 0.8, en-us; q = 0.5, en; q = 0.3 Accept-Encoding: gzip, deflate Accept-Charset : windows-1251, utf-8; q = 0.7, *; q = 0.7 Conexión: Keep-Alive Cache-Control: max-age = 0Encabezados de respuesta
HTTP / 1.1 200 OK Fecha: Jue, 29 de Septiembre de 2011 20:36:15 GMT Servidor: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-By: PHP / 5.2.10 Set-Cookie: PHPSESSID = k33en6ccgcia7125mitj5te4u6; ruta = / Caduca: Jue, 19 de noviembre de 1981 08:52:00 GMT Control de caché: sin almacenamiento, sin caché, debe revalidar, verificación posterior = 0, verificación previa = 0 Pragma: sin caché Contenido-Longitud: 58 Keep-Alive: tiempo de espera = 5, máx. = 100 Conexión: Keep-Alive Tipo de contenido: texto / htmlUn comentario
En la solicitud original, el navegador no se identificó de ninguna manera, por lo que el mecanismo Sesiones PHP generó un nuevo identificador de sesión único y le dijo al navegador que creara una cookie en la que se almacenará este identificador.
Lado del servidor
Como resultado del script en el lado del servidor, se crea el archivo sess_k33en6ccgcia7125mitj5te4u6 con el siguiente contenido:
Lado del cliente
En el lado del cliente, se crea una cookie PHPSESSID, que almacena el valor del identificador de sesión único.
Nota. A Configuración de PHP De forma predeterminada, la duración de la cookie PHPSESSID es hasta que se cierra el navegador. Aquellos. Tan pronto como se cierre el navegador, la cookie se eliminará y, en consecuencia, se perderá la sesión. La duración de la cookie PHPSESSID se puede cambiar variando el valor session.cookie_lifetime.
El resultado del guión
Segunda carga de script
Solicitar encabezados
GET / HTTP / 1.1 Anfitrión: firingrange.local Agente de usuario: Mozilla / 5.0 (Windows NT 5.1; rv: 6.0.2) Gecko / 20100101 Firefox / 6.0.2 Aceptar: texto / html, aplicación / xhtml + xml, aplicación / xml; q = 0.9, * / *; q = 0.8 Aceptar-Idioma: ru-ru, ru; q = 0.8, en-us; q = 0.5, en; q = 0.3 Aceptar codificación: gzip, desinflar Aceptar-Juego de caracteres: windows-1251, utf-8; q = 0.7, *; q = 0.7 Conexión: cookie de mantenimiento: PHPSESSID = k33en6ccgcia7125mitj5te4u6 Cache-Control: max-age = 0Encabezados de respuesta
HTTP / 1.1 200 OK Fecha: Jue, 29 de Septiembre de 2011 20:49:41 GMT Servidor: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-By: PHP / 5.2.10 Caduca: Jue, 19 de Noviembre 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check = 0, pre-check = 0 Pragma: no-cache Content-Length: 58 Keep-Alive: timeout = 5, máx. = 100 Conexión: Keep-Alive Tipo de contenido: texto / htmlUn comentario
El navegador envía la cookie PHPSESSID al servidor web, que PHP usa para inicializar la matriz $ _SESSION con los valores de sess_k33en6ccgcia7125mitj5te4u6. En consecuencia, en el bloque 2, se cumple la rama IF (directa).
Lado del servidor
Como resultado de la operación del script, el contenido del archivo sess_k33en6ccgcia7125mitj5te4u6 cambia:
Lado del cliente
Nada cambia del lado del cliente.
El resultado del guión
¿Que sigue?
Las cargas posteriores de la página antes de cerrar el navegador funcionarán de manera similar a como lo hizo la segunda carga del script.
Porque la vida útil de la cookie estuvo limitada por la sesión actual del navegador, luego, una vez cerrada, el identificador de sesión único se perderá y el proceso comenzará de nuevo cuando se reinicie.
Sin embargo, puede volver a la sesión guardada especificando explícitamente PHPSESSID como parámetro de secuencia de comandos:
Volver a la sesión es bastante arbitrario, ya que como resultado del trabajo del script, no se crea una cookie en este caso. Encabezados de respuesta del servidor:
HTTP / 1.1 200 OK Fecha: Jue, 29 de Septiembre de 2011 21:01:52 GMT Servidor: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-By: PHP / 5.2.10 Caduca: Jue, 19 de Noviembre 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check = 0, pre-check = 0 Pragma: no-cache Content-Length: 58 Keep-Alive: timeout = 5, máx. = 100 Conexión: Keep-Alive Tipo de contenido: texto / html
Aquellos. para seguir trabajando con esta sesión en particular, tendrá que asignar? PHPSESSID = k33en6ccgcia7125mitj5te4u6 a todos los enlaces.
Nota. Puede decirle a PHP que solo pase el identificador de sesión único a través de la cookie. Para hacer esto, configure session.use_only_cookies en 1. En este caso, el truco demostrado anteriormente no funcionará.
Si las cookies están deshabilitadas en el navegador, entonces puede pasar el identificador de sesión a través de los parámetros, como hicimos anteriormente. Además, PHP tiene un mecanismo que a su vez agregará el parámetro requerido a los enlaces y agregará campos ocultos a los formularios. El principio de funcionamiento es exactamente el mismo que con las cookies, por lo que no analizaremos este caso por separado.
Pequeño cuestionario (preguntas frecuentes)
¿Dónde se almacenan físicamente los datos de la sesión?
Los datos de la sesión se almacenan en el servidor. De forma predeterminada, se escriben en archivos, pero puede definir su propio mecanismo para almacenar datos de sesión (por ejemplo, utilizando una base de datos). Para obtener más detalles, consulte la función session_set_save_handler.
¿Quién genera el ID de sesión único?
El servidor genera el identificador de sesión único (PHPSESSID).
¿Puedo escribir mi propio mecanismo de sesión?
Sí, es bastante posible. Como puede ver, PHP no usa nada sobrenatural: el identificador se guarda entre solicitudes mediante cookies, los datos de la sesión se almacenan en archivos en el servidor.
Por ejemplo, el popular framework CodeIgniter tiene su propio mecanismo para trabajar con sesiones.
¿Qué tan seguro es el mecanismo de sesión?
Una sesión se identifica solo por un identificador de sesión único, por lo que, en general, un atacante solo necesita robarlo para confundir al servidor. Tomemos el script de prueba que usamos anteriormente. Si se va a acceder desde una IP diferente (en relación a la que creó la sesión), pero el PHPSESSID se transmitirá igual, entonces la sesión se restaurará con éxito y el contador aumentará desde el valor guardado anteriormente.
Proveer protección adicional tú mismo. Por ejemplo:
- Puede guardar las sesiones de IP y User-Agent del cliente en los datos de la sesión (se almacenarán en el lado del servidor), y luego, con cada llamada, verificar que los valores actuales coincidan con los guardados. En este caso, debe encontrar un compromiso entre la seguridad y la experiencia del usuario.
Por ejemplo, si un usuario tiene una IP dinámica y usa sesiones para mantener la autorización, pero al mismo tiempo verifica la coincidencia de IP, entonces cada vez que cambia la dirección, el usuario tendrá que volver a ingresar el nombre de usuario y la contraseña.
Asimismo, la cadena Usuario-Agente puede cambiar al actualizar la versión del navegador o al instalar algunos complementos.
- Uno de los mecanismos de protección de sesión recomendados es volver a generar el identificador cada vez que se llama al script (consulte la función session_regenerate_id). Puede ver el script y el algoritmo de trabajo en el contexto a continuación.
Nota. Si cree en la discusión en el sitio web oficial, cuando se vuelva a generar el identificador, pueden surgir problemas con el acceso simultáneo a los datos.
Trabajo de sesiones con regeneración del identificador en el contexto
Texto
// bloque 1
session_start ();
si(Está establecido($ _SESSION ["iniciado"]))
session_regenerate_id ();
demás
$ _SESSION ["iniciado"] = cierto;
// bloque 2
si(Está establecido($ _SESSION ["vistas"]))
$ _SESSION ["vistas"] ++;
demás
$ _SESSION ["vistas"] = 1;
// bloque 3
eco"
<
body>
Número de visualizaciones: ". $ _SESSION [" visualizaciones "]".