Diferencia entre revisiones de «Plantilla:PHP/Inaem/Sesiones»
| (9 revisiones intermedias por el mismo usuario no mostrado) | |||
| Línea 1: | Línea 1: | ||
| − | + | <div class=parrafo> | |
| + | |||
| + | ===Las sesiones=== | ||
| + | <br /> | ||
{{MRM_Conocimiento previo|Title=¿Qué son las sesiones?| | {{MRM_Conocimiento previo|Title=¿Qué son las sesiones?| | ||
| − | *Una sesión es | + | *Una sesión es un mecanismo que permite mantener información entre distintas interacciones entre un cliente (navegador) y un servidor. |
| − | *Podríamos verla como una '''''conversación''''' entre dos partes. | + | *Podríamos verla como una '''''conversación''''' entre dos partes que se mantiene durante varias peticiones HTTP. |
| − | * | + | *HTTP es un protocolo '''''sin estado''''', lo que significa que cada petición es independiente y el servidor no recuerda las anteriores. |
| − | *Durante | + | *Durante una sesión se pueden establecer variables cuyos valores estarán disponibles en el servidor para los distintos '''scripts''' solicitados por el cliente. |
| − | *Es una forma de | + | *Es una forma de hacer que variables estén disponibles en múltiples páginas de una aplicación web. |
| − | {{Tip| Por '''''cliente''''' | + | {{Tip| Por '''''cliente''''' entendemos normalmente un navegador (o agente HTTP) que interactúa con el servidor.}} |
}} | }} | ||
| − | |||
{{MRM_Pregunta|Title=Por qué necesitamos sesiones| | {{MRM_Pregunta|Title=Por qué necesitamos sesiones| | ||
| − | ;Porque la programación web está | + | ;Porque la programación web está basada en HTTP, un protocolo sin estado. |
*Muchas veces '''''necesitamos''''' mantener valores de variables entre diferentes scripts invocados por un mismo cliente. | *Muchas veces '''''necesitamos''''' mantener valores de variables entre diferentes scripts invocados por un mismo cliente. | ||
}} | }} | ||
| + | |||
===Ideas generales de las sesiones=== | ===Ideas generales de las sesiones=== | ||
| Línea 20: | Línea 23: | ||
;Sabemos qué son las '''''cookies'''''. | ;Sabemos qué son las '''''cookies'''''. | ||
}} | }} | ||
| + | |||
<br /> | <br /> | ||
| − | * | + | |
| − | * Para identificar al usuario que generó las variables de sesión, el servidor | + | * Las sesiones tienen un tiempo limitado de existencia. |
| − | * | + | * Para identificar al usuario que generó las variables de sesión, el servidor crea una clave única llamada '''''SID (Session ID)'''''. |
| − | * | + | * Esta clave se envía al navegador y normalmente se almacena en una '''''cookie'''''. |
| − | * | + | * Cada vez que el navegador solicita una nueva página al mismo sitio, envía esta '''''cookie''''' con el SID. |
| − | + | * Con ese SID el servidor identifica al cliente y recupera las variables de sesión almacenadas. | |
| − | * | + | |
| − | * Desventaja: | + | * Normalmente los datos de sesión se guardan en '''archivos en el servidor''', aunque PHP permite utilizar otros sistemas de almacenamiento (memoria, bases de datos, etc.). |
| + | |||
| + | * Si una sesión permanece inactiva durante un tiempo determinado, PHP elimina automáticamente sus datos. | ||
| + | Por defecto este tiempo suele ser de '''1440 segundos (24 minutos)''', aunque puede configurarse. | ||
| + | |||
| + | * Las '''variables de sesión''' son más seguras que las '''cookies''', ya que su contenido se almacena en el servidor y no es visible directamente para el cliente. | ||
| + | |||
| + | * El navegador únicamente envía el '''SID''' en cada petición, no el contenido completo de las variables. | ||
| + | |||
| + | * Desventaja: las sesiones ocupan espacio en el servidor, lo que puede ser un problema si existen muchas sesiones activas. | ||
| + | |||
| + | * Si el navegador tiene las cookies desactivadas, las sesiones normalmente no funcionarán correctamente. | ||
{{MRM_Puntos clave|Title=Dónde se almacenan| | {{MRM_Puntos clave|Title=Dónde se almacenan| | ||
| − | ;Las variables de sesión se | + | ;Las variables de sesión se almacenan en el servidor |
| + | }} | ||
| + | |||
| + | ===SID de la sesión=== | ||
| + | |||
| + | Estas ideas son transparentes para el programador, no las tenemos que controlar directamente, pero conviene conocer cómo funcionan. | ||
| + | |||
| + | *Existen dos formas de mantener el '''SID''' de la sesión: | ||
| + | |||
| + | #Utilizando '''cookies''' (forma más habitual). | ||
| + | #Propagando el SID como parámetro en la URL. | ||
| + | |||
| + | Ejemplo: | ||
| + | |||
| + | http://www.misitioweb.com/tienda/listado.php?PHPSESSID=34534fg4ffg34ty | ||
| + | |||
| + | *En el ejemplo anterior, el SID es el valor del parámetro '''PHPSESSID'''. | ||
| + | |||
| + | En PHP todas estas acciones se realizan de forma transparente para el programador. | ||
| + | Como desarrolladores podemos utilizar directamente las sesiones mediante '''''supervariables''''' y '''''funciones'''''. | ||
| + | |||
| + | ===Cómo funciona una sesión=== | ||
| + | |||
| + | De forma simplificada el proceso es el siguiente: | ||
| + | |||
| + | #El cliente solicita una página al servidor. | ||
| + | #El servidor crea una sesión y genera un '''SID'''. | ||
| + | #El SID se envía al navegador (normalmente mediante una cookie). | ||
| + | #En cada petición posterior el navegador envía ese SID al servidor. | ||
| + | #El servidor utiliza el SID para recuperar los datos de la sesión. | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
===Configuración=== | ===Configuración=== | ||
| − | Existen una serie de '''''directivas''''' para configurar las sesiones | + | |
| + | Existen una serie de '''''directivas''''' para configurar las sesiones que conviene conocer. | ||
| + | |||
{{MRM_Pregunta|Title=Ubicación del fichero de configuración| | {{MRM_Pregunta|Title=Ubicación del fichero de configuración| | ||
| − | + | ¿Dónde está el fichero de configuración de PHP? | |
}} | }} | ||
| + | |||
<br /> | <br /> | ||
| − | * | + | |
| − | *Para ver todas las directivas http://es.php.net/manual/es/session.configuration.php | + | *Las directivas de configuración de sesiones pueden consultarse con la función `phpinfo()` y modificarse en el archivo de configuración de PHP '''php.ini'''. |
| − | + | ||
| + | *Para ver todas las directivas: | ||
| + | http://es.php.net/manual/es/session.configuration.php | ||
| + | |||
| + | Algunas directivas importantes son: | ||
| + | |||
;session.use_cookies | ;session.use_cookies | ||
| − | :Indica si se deben usar cookies (1 | + | :Indica si se deben usar cookies (1) para almacenar el SID. |
| − | + | ||
| − | : | + | ;session.use_only_cookies |
| + | :Si se activa (1), se desactiva la propagación del SID en la URL. | ||
| + | :Esto mejora la seguridad evitando ataques como el '''session hijacking'''. | ||
| + | |||
;session.save_handler | ;session.save_handler | ||
| − | : | + | :Indica cómo se almacenan los datos de sesión. |
| + | :El valor por defecto es '''files''' (archivos en el servidor). | ||
| + | |||
;session.name | ;session.name | ||
| − | : | + | :Nombre de la cookie que almacena el SID. |
| + | :Por defecto es '''PHPSESSID'''. | ||
| + | |||
;session.auto_start | ;session.auto_start | ||
| − | : | + | :Si está activado (1), PHP inicia automáticamente una sesión en cada página. |
| + | :Normalmente se recomienda mantenerlo en '''0''' y utilizar la función '''session_start()''' de forma explícita. | ||
| + | |||
;session.cookie_lifetime | ;session.cookie_lifetime | ||
| − | : | + | :Indica cuánto tiempo vive la cookie de sesión. |
| + | :Si vale '''0''', la cookie se elimina al cerrar el navegador. | ||
| + | |||
;session.gc_maxlifetime | ;session.gc_maxlifetime | ||
| − | :Indica el tiempo en segundos que | + | :Indica el tiempo en segundos que los datos de sesión pueden permanecer inactivos antes de eliminarse. |
| + | :Por defecto suele ser '''1440 segundos (24 minutos)'''. | ||
| + | |||
===Creando la sesión=== | ===Creando la sesión=== | ||
| + | [[Imagen:establecer_sesion.png|800px]]<br /> | ||
| + | [[Imagen:almacenar_sesion.png|800px]]<br /> | ||
<br /> | <br /> | ||
| − | {{MRM_Definicion|Title=Qué es una | + | |
| − | De forma coloquial | + | {{MRM_Definicion|Title=Qué es una sesión| |
| − | ;Una sesión es | + | De forma coloquial: |
| − | *Mientras dura la sesión | + | |
| − | *Si | + | ;Una sesión es un mecanismo que permite a un servidor recordar información entre varias peticiones de un mismo cliente. |
| − | *Al cerrar el navegador se | + | |
| − | {{Tip| | + | *Mientras dura la sesión podemos almacenar variables y acceder a ellas. |
| + | *Si abrimos un navegador y accedemos a un sitio web, el servidor puede crear una sesión. | ||
| + | *Al cerrar el navegador normalmente se elimina la cookie de sesión (aunque los datos pueden permanecer en el servidor durante cierto tiempo). | ||
| + | |||
| + | {{Tip|En algunos casos la sesión puede permanecer activa durante un tiempo incluso después de cerrar el navegador.}} | ||
}} | }} | ||
| + | |||
{{MRM_Ejemplo|Title=Comparación de qué es una sesión| | {{MRM_Ejemplo|Title=Comparación de qué es una sesión| | ||
| − | * | + | *Es como entrar en un centro comercial. |
| − | *Mientras | + | *Mientras estamos dentro seguimos en la misma "sesión". |
| − | *Cuando | + | *Cuando salimos se termina. |
| − | * | + | *Mientras estamos dentro podrían mantener información sobre nosotros (por ejemplo productos que hemos añadido a la cesta). |
| − | + | }} | |
| + | |||
====Crear y usar una sesión==== | ====Crear y usar una sesión==== | ||
| − | *Para usar sesiones | + | |
| − | * | + | *Para usar sesiones normalmente debemos iniciarlas de forma explícita. |
| − | + | *Esto se hace mediante la función '''''session_start()'''''. | |
| − | + | ||
| − | + | ||
<source lang=php> | <source lang=php> | ||
<?php | <?php | ||
| − | + | ||
| − | + | session_start(); | |
| − | $_SESSION['nombre']='manuel'; | + | |
| − | + | $_SESSION['nombre'] = 'manuel'; | |
?> | ?> | ||
</source> | </source> | ||
| − | * | + | *Hemos creado la variable de sesión '''''nombre'''''. |
| − | * | + | *Mientras dure la sesión, cualquier script podrá acceder a esa información. |
| − | + | ||
| + | En otro fichero PHP: | ||
| + | |||
<source lang=php> | <source lang=php> | ||
<?php | <?php | ||
| − | + | ||
| − | + | session_start(); | |
| + | |||
$usuario = $_SESSION['nombre']; | $usuario = $_SESSION['nombre']; | ||
| − | + | ||
?> | ?> | ||
</source> | </source> | ||
| − | |||
| + | {{Tip|'''$_SESSION''' es un array asociativo que permite almacenar información durante la sesión del usuario.}} | ||
===Eliminando la sesión=== | ===Eliminando la sesión=== | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | *Las sesiones pueden eliminarse automáticamente tras un tiempo de inactividad. | ||
| + | *También podemos eliminarlas manualmente. | ||
| + | |||
| + | ;session_unset | ||
| + | :Elimina las variables almacenadas en la sesión actual. | ||
| + | |||
| + | ;session_destroy | ||
| + | :Elimina completamente los datos de la sesión. | ||
| + | |||
| + | {{Tip| | ||
| + | Cuando se produce un cambio de estado importante (por ejemplo un login), es recomendable regenerar el identificador de sesión: | ||
| + | |||
| + | session_regenerate_id(); | ||
| + | |||
| + | Esto ayuda a evitar ataques de '''session fixation'''. | ||
| + | }} | ||
{{MRM_Lectura|Title=Documentación| | {{MRM_Lectura|Title=Documentación| | ||
| − | * http://www.php.net/manual/es/ | + | * http://www.php.net/manual/es/book.session.php |
* http://www.w3schools.com/php/php_sessions.asp | * http://www.w3schools.com/php/php_sessions.asp | ||
* http://www.mclibre.org/consultar/php/lecciones/php_sesiones.html | * http://www.mclibre.org/consultar/php/lecciones/php_sesiones.html | ||
}} | }} | ||
| + | |||
===Actividades=== | ===Actividades=== | ||
<br /> | <br /> | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | {{MRM_Actividad|Title=Registro de acceso| | |
| − | + | *Vamos a simular un sitio web con autenticación por base de datos. | |
| − | + | *Siguiendo el esquema que se muestra | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| + | [[Archivo:app_logueo1.png|800px|center]] | ||
| + | *Al abrir la aplicación se nos pedirá que nos logueemos (usuario y password). | ||
| + | *Debe existir una base de datos llamada '''''dwes''''' con una tabla llamada '''''usuarios''''' que tenga dos campos: '''usuario''' y '''pass'''. | ||
| + | *Crea un fichero SQL que genere la tabla y añada un usuario con los valores '''dwes''' y '''abc123.'''. | ||
| + | [[Archivo:tabla_usuarios.png]] | ||
| + | *Al pulsar '''''Validar''''' comprobaremos si existe un registro con esos valores. | ||
| + | *Si no existe, permaneceremos en la misma pantalla mostrando el mensaje '''''Datos incorrectos'''''. | ||
| + | *Si es correcto, iremos a la pantalla '''''sitio1.php'''''. | ||
| + | *Desde ahí podremos ir a '''''sitio2.php''''' o bien '''''desconectar'''''. | ||
| + | *Utilizaremos la variable de sesión: | ||
| − | + | $_SESSION['usuario'] | |
| + | |||
| + | para comprobar si el usuario está autenticado. | ||
| + | |||
| + | *Si se intenta acceder directamente a '''''sitio1.php''''' o '''''sitio2.php''''' sin estar logueado, se redirigirá a '''''index.php''''' mostrando el mensaje '''''Debes loguearte'''''. | ||
| + | }} | ||
| + | </div> | ||
Última revisión de 18:32 4 mar 2026
Contenido
Las sesiones
Tip: Por cliente entendemos normalmente un navegador (o agente HTTP) que interactúa con el servidor.
|
Ideas generales de las sesiones
- A diferencia de las cookies, las variables de sesión se almacenan en el servidor.
- Las sesiones tienen un tiempo limitado de existencia.
- Para identificar al usuario que generó las variables de sesión, el servidor crea una clave única llamada SID (Session ID).
- Esta clave se envía al navegador y normalmente se almacena en una cookie.
- Cada vez que el navegador solicita una nueva página al mismo sitio, envía esta cookie con el SID.
- Con ese SID el servidor identifica al cliente y recupera las variables de sesión almacenadas.
- Normalmente los datos de sesión se guardan en archivos en el servidor, aunque PHP permite utilizar otros sistemas de almacenamiento (memoria, bases de datos, etc.).
- Si una sesión permanece inactiva durante un tiempo determinado, PHP elimina automáticamente sus datos.
Por defecto este tiempo suele ser de 1440 segundos (24 minutos), aunque puede configurarse.
- Las variables de sesión son más seguras que las cookies, ya que su contenido se almacena en el servidor y no es visible directamente para el cliente.
- El navegador únicamente envía el SID en cada petición, no el contenido completo de las variables.
- Desventaja: las sesiones ocupan espacio en el servidor, lo que puede ser un problema si existen muchas sesiones activas.
- Si el navegador tiene las cookies desactivadas, las sesiones normalmente no funcionarán correctamente.
SID de la sesión
Estas ideas son transparentes para el programador, no las tenemos que controlar directamente, pero conviene conocer cómo funcionan.
- Existen dos formas de mantener el SID de la sesión:
- Utilizando cookies (forma más habitual).
- Propagando el SID como parámetro en la URL.
Ejemplo:
http://www.misitioweb.com/tienda/listado.php?PHPSESSID=34534fg4ffg34ty
- En el ejemplo anterior, el SID es el valor del parámetro PHPSESSID.
En PHP todas estas acciones se realizan de forma transparente para el programador. Como desarrolladores podemos utilizar directamente las sesiones mediante supervariables y funciones.
Cómo funciona una sesión
De forma simplificada el proceso es el siguiente:
- El cliente solicita una página al servidor.
- El servidor crea una sesión y genera un SID.
- El SID se envía al navegador (normalmente mediante una cookie).
- En cada petición posterior el navegador envía ese SID al servidor.
- El servidor utiliza el SID para recuperar los datos de la sesión.
Configuración
Existen una serie de directivas para configurar las sesiones que conviene conocer.
- Las directivas de configuración de sesiones pueden consultarse con la función `phpinfo()` y modificarse en el archivo de configuración de PHP php.ini.
- Para ver todas las directivas:
http://es.php.net/manual/es/session.configuration.php
Algunas directivas importantes son:
- session.use_cookies
- Indica si se deben usar cookies (1) para almacenar el SID.
- session.use_only_cookies
- Si se activa (1), se desactiva la propagación del SID en la URL.
- Esto mejora la seguridad evitando ataques como el session hijacking.
- session.save_handler
- Indica cómo se almacenan los datos de sesión.
- El valor por defecto es files (archivos en el servidor).
- session.name
- Nombre de la cookie que almacena el SID.
- Por defecto es PHPSESSID.
- session.auto_start
- Si está activado (1), PHP inicia automáticamente una sesión en cada página.
- Normalmente se recomienda mantenerlo en 0 y utilizar la función session_start() de forma explícita.
- session.cookie_lifetime
- Indica cuánto tiempo vive la cookie de sesión.
- Si vale 0, la cookie se elimina al cerrar el navegador.
- session.gc_maxlifetime
- Indica el tiempo en segundos que los datos de sesión pueden permanecer inactivos antes de eliminarse.
- Por defecto suele ser 1440 segundos (24 minutos).
Creando la sesión
|
De forma coloquial:
Tip: En algunos casos la sesión puede permanecer activa durante un tiempo incluso después de cerrar el navegador.
|
Comparación de qué es una sesión
| |
|
Crear y usar una sesión
- Para usar sesiones normalmente debemos iniciarlas de forma explícita.
- Esto se hace mediante la función session_start().
<?php session_start(); $_SESSION['nombre'] = 'manuel'; ?>
- Hemos creado la variable de sesión nombre.
- Mientras dure la sesión, cualquier script podrá acceder a esa información.
En otro fichero PHP:
<?php session_start(); $usuario = $_SESSION['nombre']; ?>
Eliminando la sesión
- Las sesiones pueden eliminarse automáticamente tras un tiempo de inactividad.
- También podemos eliminarlas manualmente.
- session_unset
- Elimina las variables almacenadas en la sesión actual.
- session_destroy
- Elimina completamente los datos de la sesión.
Cuando se produce un cambio de estado importante (por ejemplo un login), es recomendable regenerar el identificador de sesión:
session_regenerate_id();
Esto ayuda a evitar ataques de session fixation.
Actividades
$_SESSION['usuario'] para comprobar si el usuario está autenticado.
|
