Desarrollo de aplicaciones web con PHP y MySQL
Cookies y sesiones en PHP
Sergio Sáez y José Luis Poza
E.T.S. de Ingeniería Informática
Cookies en PHP
- Las cookies permiten almacenar información sobre el cliente entre diferentes conexiones.
- Es el navegador del cliente el que mantiene la información especificada por las páginas visitadas.
- Esta información se clasifica por servidores y se envía automáticamente cada vez que se vuelve al mismo servidor.
- Si se cambia de cliente o de máquina la información no estará disponible.
- PHP soporta de forma transparente las cookies del protocolo HTTP.
Cookies en PHP (cont.)
- Las cookies se identifican mediante su nombre y permiten almacenar diversa información
- El valor de la cookie.
- Es una cadena.
- El tiempo de expiración.
- Instante de tiempo en el que caducará la cookie y será eliminada por el navegador.
- La ruta.
- Permite diferenciar dentro del mismo dominio o servidor cúal es la ruta en la que la cookie es valida.
- El domino.
- Se puede especificar para qué dominio se establece la galleta, con lo que puede ser accesible desde otros servidores del mismo dominio.
- Modo seguro.
- Especifica que una cookie no se enviará si la conexión no es segura (protocolo HTTPS).
Estableciendo una cookie
- Una cookie se establece mediante la función setcookie().
<?php bool setcookie (string name [, string value [, int expire
[, string path [, string domain
[, bool secure [, bool httponly]]]]]] ); ?>
- name
- es el nombre de la cookie.
- value
- es el valor de la cookie y siempre es una cadena.
- expire
- indica la feca de caducidad de la cookie.
- path y domain
- especifican el domino y la ruta de validez de la cookie.
- secure
- indica que la cookie sólo se debe transmitir en modo seguro (v.g. https).
- httponly (desde PHP 5.2)
- indica que la cookie sólo está accesible mediante protocolo http y otros lenguajes como javascript no pueden acceder a ella.
Estableciendo una cookie (cont.)
- El único campo necesario es el nombre.
- Los demás campos se pueden ignorar poniendo una cadena vacia o un 0 para acceder a un parámetro posterior.
- Si se pone sólo el nombre, se borra la cookie.
- Las cookies se envían en la cabecera de la respuesta del servidor, antes de cualquier contenido en HTML.
- Las cookies se deben establecer antes de que se envíe cualquier contenido al cliente.
- Se puede gestionar el buffer de salida mediante el uso de las funciones ob_*();
<?php
setcookie("nombre", "Sergio Saez");
setcookie("usuario", "ssaez", time()+3600); // Expira en una hora
setcookie("password", $password, time()+3600, "/~ssaez/",".upv.es");
setcookie("password", "", 0, "", "", true);
?>
Accediendo a una cookie en PHP
- Los valores de las cookies enviadas por el navegador se visualizarán en los scripts PHP dentro del vector $_COOKIE.
<?php // Establece la cookie
setcookie("nombre", "Sergio Sáez");
?>
<?php // La siguiente página que se cargue podrá verla
echo "Nombre: ". $_COOKIE["nombre"];
?>
Nombre: Sergio Sáez
<?php // La cookie no se puede ver en el mismo script que la define
if (!isset($_COOKIE["nombre"])) {
setcookie("nombre", "Desconocido");
} // endif
echo "Nombre: ". $_COOKIE["nombre"];
?>
PHP Notice: Undefined index: nombre in Standard input code on line 5
Nombre:
Flujo de datos con las cookies
- El navegador solicita una página en PHP
- El servidor web la procesa, genera una cookie y se la envía al navegador.
- En el script que genera la cookie, ésta no se puede ver.
- El navegador la almacena, y la enviará en todas las siguientes peticiones a ese servidor.
- El interprete PHP verá las nuevas cookies que le envía el navegador.
|
|
Flujo de datos con las cookies (cont.)
- Primera petición
-
GET /~ssaez/intranet/ HTTP/1.1
Host: viver.disca.upv.es:8080
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20090207 ...
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain; ...
Accept-Language: es,en;q=0.7,en-us;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
- Respuesta
-
HTTP/1.1 200 OK
Date: Thu, 14 Feb 2009 19:08:55 GMT
Server: Apache/2.2.4 (Ubuntu) mod_python/3.3.1 Python/2.5.1 PHP/5.2.3-1ubuntu6.3
X-Powered-By: PHP/5.2.3-1ubuntu6.3
Set-Cookie: PHPSESSID=563df31d660d982d9df4721cbc07aafb; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 7344
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
...
Flujo de datos con las cookies (cont.)
- Siguinte petición
-
GET /~ssaez/intranet/ HTTP/1.1
Host: viver.disca.upv.es:8080
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20090207 ...
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain; ...
Accept-Language: es,en;q=0.7,en-us;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=563df31d660d982d9df4721cbc07aafb
Vectores de cookies
- Para establecer vectores de cookies se utiliza la notación de vector en el nombre de la cookie.
<?php
setcookie( "cesta[54873498]", 4);
setcookie( "cesta[04928734]", 2);
setcookie( "cesta[98432745]", 3);
?>
<?php
if ( isset( $_COOKIE["cesta"] ) ) {
while(list($producto,$cantidad)= each($_COOKIE["cesta"] ) ) {
echo "ID: $producto. Cantidad: $cantidad<br>\n";
} // endwhile
} else {
echo "La cesta está vacía.<br>\n";
} // endif
?>
- El vector se verá en orden inverso.
ID: 98432745. Cantidad: 3<br>
ID: 04928734. Cantidad: 2<br>
ID: 54873498. Cantidad: 4<br>
Sesiones en PHP
- Las sesiones son un mecanismo que nos permite almacenar información en el servidor y que permanecerá entre un acceso y otro.
- Cuando un cliente visita nuestra página se le asigna un identificador de sesión con el que se asociará la información.
- El identidicador se almacenará en una cookie o en la propia URL.
- El lugar en el que se almacena el identificador de sesión depende de la configuración.
- Normalmente se utilizan cookies.
- Cuando se inicia una sesión PHP comprueba automáticamente si ya existía alguna. En caso afirmativo recupera toda la información asociada.
- A la información almacenada en una sesión se les denomina variables de sesión.
Sesiones en PHP (cont.)
- Se puede iniciar una sesión invocando la función session_start().
- Comprueba automáticamente si ya existía alguna sesión. En caso afirmativo recupera la información asociada.
- Si el identificador de sesión se almacena como una cookie, la sesión se debería iniciar antes de enviar ninguna salida al navegador.
- También se pueden utilizar las funciones de control de buffer de salida: ob_start() y ob_end_flush().
- El vector $_SESSION mantiene las variables de sesión.
- Si la sesión ha sido inicializada, todo lo que se escribe en este vector permanecerá entre los diferentes accesos.
- Las variables de sesión pueden almacenar datos de cualquier tipo: escalares y compuestos.
- La función session_destroy() destruye todos los datos asociados con una sesión.
Acceso a las variables de sesión
- Consultar si una variable está establecida.
<?php // Comprueba si la variable de sesión 'nombre' existe
if (isset($_SESSION['nombre'])) {
...
}
?>
- Modificar el valor de una variable.
<?php // Asigna un nuevo valor a la variable de sesión 'nombre'
$_SESSION['nombre'] = $valor;
?>
- Acceder al contenido de una variable establecida.
<?php // Lee el valor de la variable de sesión 'nombre'
echo $_SESSION['nombre'];
?>
- Eliminando una variable establecida en una sesión.
<?php // Elimina la variable de sesión 'nombre'
unset($_SESSION['nombre']);
?>
Ejemplo de uso de $_SESSION
Otras funciones
- Se pueden cambiar los parámetros de la cookie utilizada para recordar la sesión con la función session_set_cookie_params.
<?php bool session_set_cookie_params (int $lifetime [, string $path
[, string $domain
[, bool $secure = false
[, bool $httponly = false ]]]]); ?>
- Establece la caducidad, la ruta, el dominio, el modo seguro y el acceso de la galleta utilizada para identificar la sesión. El significado es el mismo que para la función setcookie.
- Se debe invocar antes de llamar a la función session_start().
- Sus efectos sólo afectan a la ejecución del script actual. Por lo tanto, habrá que invocar la función session_set_cookie_params antes de cada session_start().
Precauciones en el uso de sesiones
- Comenzar una sesión
- Se debe comenzar una sesión con session_start() en cada fichero PHP en que se quieran utilizar las variables de sesión, ya sea para modificarlas o para consultarlas.
Cuidado, si se utilizan cookies para almacenar el identificador de sesión, no se debe enviar nada hacia el navegador antes de comenzar la sesión.
- Destruir una sesión
- Una sesión se destruye con session_destroy() sólo cuando ya no quieres volver a utilizar las variables de sesión existentes.
No se debe utilizar al final de cada fichero PHP, sólo cuando el usuario se vaya a "desconectar".