Donde se almacenan las sesiones de PHP. Sesiones PHP bajo el escalpelo.
En Internet, puede encontrar miles de tutoriales sobre qué sesiones son para lo que necesitan y cómo trabajar con ellos. Pero, desafortunadamente, después de leerlos, quedan muchas preguntas. En mi opinión, la forma más fácil de resolverlo en todo es ver cómo funcionan las sesiones desde el interior. Esos. Examine los registros de intercambio de navegadores y servidores web, así como ver qué datos se guardan en el lado del cliente y en el lado del servidor.
Después de eso, muchos momentos se vuelven mucho más claros, y el mecanismo en sí es más transparente.
Las sesiones se estudiarán en el siguiente script estándar:
Funciona de la siguiente manera:
Bloque 1. La función Session_Start () crea una nueva sesión o carga la antigua, utilizando el Identificador de sesión de Phsessid único.
Bloque 2. Si logró restaurar la sesión, el valor de $ _Session ["Vistas"] aumenta por uno. Si no, se inicializa por uno.
En teoría, si el soporte de cocción está habilitado en el navegador, el mecanismo debe funcionar y cada vez que se actualiza la página, el valor del medidor aumentará por uno.
Primer script de carga
Encabezados de solicitud
GET / HTTP / 1.1 Host: FiringRange.Local User-Agent: 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 \u003d 0.9, * / *; Q \u003d 0.8 Aceptar-Idioma: RU-EN, RU; Q \u003d 0.8, EN-EEUU; Q \u003d 0.5, EN; Q \u003d 0.3 Aceptar-Coding: Gzip, Deflate Acept-Chart-Chartset : Windows-1251, UTF-8; Q \u003d 0.7, *; Q \u003d 0.7 Conexión: Mantener Alive Cache-Control: Max-EDE \u003d 0Asqueros
Http / 1.1 200 ok Fecha: Jue, 29 sep 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 \u003d k33en6cccia7125mitj5te4u6; camino \u003d / Caduca: Jue, 19 de noviembre de 1981 08:52:00 GMT Control de caché: sin tienda, no-caché, debe revalidar, post-cheque \u003d 0, pre-cheque \u003d 0 Pragma: Longitud del contenido de no-caché: 58 MANTENIMIENTO: Tiempo de espera \u003d 5, max \u003d 100 Conexión: Tipo de contenido METH-ALIVE: Texto / HTMLComentario
En la solicitud inicial, el navegador no se ha identificado de ninguna manera, por lo que el mecanismo sesiones PHP. Generó un nuevo identificador de sesión único y le ordenó al navegador crear un grupo en el que se almacenará este mismo identificador.
Servidor lateral
Como resultado del script en el lado del servidor, se crea el sess_k33en6cccia7125mitj5te4u6 del siguiente contenido:
Lado del cliente
En el lado del cliente, se crea Cook Phpsessid, en el que se almacena el valor del identificador único de la sesión.
Nota. Para configuraciones PHP De forma predeterminada, la vida útil de Cook Phpsessid, hasta que el navegador esté cerrado. Esos. Tan pronto como el navegador esté cerrado, se eliminará el cocinero, y la sesión se perderá en consecuencia. La vida útil de la cookie Phpsessid se puede cambiar variando el valor de la sesión. COOKIE_LIFETIME.
El resultado de la obra del script.
Segundo script de carga
Encabezados de solicitud
GET / http / 1.1 host: 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 \u003d 0.9, * / *; Q \u003d 0.8 Idioma: RU-EN, RU; Q \u003d 0.8, EN-US; Q \u003d 0.5, EN; Q \u003d 0.3 Aceptar: codificación: gzip, desinfla Aceptar-Chart: Windows-1251, UTF-8; Q \u003d 0.7, *; Q \u003d 0.7 Conexión: Galleta Mantener Alive: PHPSESSID \u003d K33EN6CCCIA7125MITJ5TE4U6 Caché-Control de caché: Max-Edad \u003d 0Asqueros
Http / 1.1 200 OK Fecha: Thu, 29 sep 2011 20:49:41 GMT Server: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-by: PHP / 5.2.10 expira: JU, 19 nov 1981 08:52:00 GMT Cache-Control: No-Store, No-Cache, Must-Revalidate, Post-Check \u003d 0, PRE-Check \u003d 0 Pragma: No-Cache Content-Longitud: 58 Keep-Live: Tiempo de espera \u003d 5, MAX \u003d 100 Conexión: Tipo de contenido METH-ALIVE: Texto / HTMLComentario
El navegador envía un servidor web de FPSESSID COOK utilizando PHP inicializa la matriz de $ _Session con valores del archivo SESS_K33EN6CCGCIA7125MITJ5TE4U6. En consecuencia, en el bloque 2 funciona la rama IF (recta).
Servidor lateral
Como resultado de la operación del script, el contenido del archivo SESS_K33EN6CCGCIA7125MITJ5TE4U6 está cambiando:
Lado del cliente
El cliente no cambia en el cliente.
El resultado de la obra del script.
¿Que sigue?
Las descargas posteriores de la página antes de cerrar el navegador funcionarán por analogía con la forma en que funcionó la segunda carga del script.
Porque La vida útil de COCK se limitó a la sesión actual del navegador, luego de su cierre, se perderá el identificador de sesión único y cuando se reiniciará el proceso continuará en uno nuevo.
Sin embargo, puede volver a la sesión guardada, si especifica explícitamente Phsessid como el parámetro Script:
Volver a la sesión es bastante condicional, porque Como resultado de la operación del script en este caso, no se crea Cook. Encabezados de respuesta del servidor:
Http / 1.1 200 OK Fecha: Thu, 29 sep 2011 21:01:52 GMT Server: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-by: PHP / 5.2.10 Vence: Thu, 19 nov 1981 08:52:00 GMT Cache-Control: No-Store, No-Cache, Must-Revalidate, Post-Check \u003d 0, PRE-Check \u003d 0 Pragma: No-Cache Content-Longitud: 58 Keep-Live: Tiempo de espera \u003d 5, MAX \u003d 100 Conexión: Tipo de contenido METH-ALIVE: Texto / HTML
Esos. Para mantener el trabajo, es de esta sesión a todos los enlaces para ser atribuidos a? Phpsessid \u003d k33en6cccia7125mitj5te4u6.
Nota. Puede especificar PHP para que el identificador de sesión único se transmita solo a través del cocinero. Para hacer esto, instale la sesión. Uso_only_Cookies en valor 1. En este caso, el truco, demostrado anteriormente, no pasará.
Si las cookies están deshabilitadas en el navegador, puede transmitir el ID de sesión a través de los parámetros, como lo hicimos anteriormente. Además, hay un mecanismo en PHP que agregará el parámetro deseado al enlace y agregará campos ocultos en el formulario. El principio de operación es exactamente lo mismo que con las cookies, por lo que no desarmaremos este caso por separado.
Pequeño cuestionario (Preguntas frecuentes)
¿Dónde se almacena los datos de la sesión físicamente almacenados?
Los datos de la sesión se almacenan en el servidor. De forma predeterminada, se registran en archivos, pero puede especificar su propio mecanismo de almacenamiento de datos de sesión (por ejemplo, utilizando una base de datos). Si desea detalles, consulte la función Session_Set_Save_Handler.
¿Quién genera un identificador de sesión único?
Un identificador de sesión único (PHPSESSID) genera un servidor.
¿Es posible escribir su propio mecanismo de sesiones?
Sí, es bastante posible. Como puede ver, PHP no usa nada sobrenatural: el identificador se guarda entre las solicitudes con cocción, los datos de sesiones se almacenan en los archivos en el servidor.
Por ejemplo, el propio mecanismo de trabajar con sesiones está en el marco popular Codeigniter.
¿Qué tan seguro es el mecanismo de las sesiones?
La sesión se identifica solo con la ayuda de un identificador de sesión único, por lo que en el caso general, el atacante es suficiente para robarlo para confundir al servidor. Tome el script de prueba que usamos anteriormente. Si la apelación es de otra IP (con respecto a la sesión que creó), pero Phsessid se transmitirá igual, entonces la sesión se restaurará con éxito y el contador aumentará del valor guardado anterior.
Proveer defensa adicional Tendrás para ti. Por ejemplo:
- Puede guardar en los datos de la sesión IP y el cliente del agente de usuario (se almacenará en el lado del servidor), y luego en cada asa es necesario verificar que los valores actuales se coinciden con los guardados. En este caso, debe buscar un compromiso entre la seguridad y la conveniencia del usuario.
Por ejemplo, si el usuario tiene una IP dinámica y utiliza la sesión para mantener la autorización, pero al mismo tiempo verifique la navegación de la IP, luego con cada cambio de dirección, el usuario tendrá que volver a ingresar el nombre de usuario y la contraseña.
De manera similar, la cadena del agente de usuario puede variar 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 un identificador cada vez que el script apela (consulte la función session_regenerate_id). Ver el script y el algoritmo de trabajo en la sección puede estar a continuación.
Nota.Si cree la discusión sobre el sitio web oficial, cuando se vuelva a generar un identificador, los problemas pueden surgir con acceso paralelo a los datos.
Sesiones de trabajo con un identificador de reingeneración en el contexto.
Texto
// Bloque 1.
session_start ();
si(está establecido.($ _Session ["iniciado"]))
session_regenerate_id ();
dEMÁS.
$ _Session ["iniciado"] \u003d cierto.;
// Bloque 2.
si(está establecido.($ _Session ["Vistas"]))
$ _Session ["Vistas"] ++;
dEMÁS.
$ _Session ["Vistas"] \u003d 1;
// Bloque 3.
eco."
<
body>
Número de vistas: ". $ _Session [" Vistas "]".