Proyecto: PHP: cookies y sesiones

Resumen

Conocer el concepto de cookie y sus posibles usos. Aprender a utilizar las cookies con PHP. Conocer el concepto de sesión en una aplicación web y sus posibles usos. Aprender a utilizar las sesiones con PHP.

Contenido

  1. Objetivos
  2. ¿Qué tengo que hacer?
  3. ¿Cómo lo hago?
  4. Recomendaciones
  5. Recursos

Objetivos


¿Qué tengo que hacer?

En esta práctica tienes que emplear las cookies para conservar información de los usuarios entre diferentes visitas al sitio web. En concreto, tienes que emplear las cookies desde PHP para:

Figura 1: Opción "recordarme en este equipo" en Hotmail y Blogger

En la Figura 2 se muestra un ejemplo de cómo se tiene que hacer lo que se pide: a la izquierda se muestra el formulario de acceso cuando no se está recordando a un usuario, mientras que a la derecha aparece cómo se tiene que visualizar cuando se está recordando a un usuario.

Figura 2: Cambio del formulario de acceso cuando se está recordando un usuario

Además, tienes que emplear las sesiones de PHP para controlar el correcto acceso como usuario registrado. Ahora mismo existe un problema de seguridad en el sitio web: si se conoce la URL, se puede acceder directamente a la página con el menú de usuario registrado sin tener que pasar por la página de control de acceso. Tienes que programar un sistema para que sólo se muestre la página con el menú de usuario registrado a aquellos usuarios que hayan introducido un nombre de usuario y una contraseña correctos.

Además, en la página menú como usuario registrado (la página principal de la parte privada) tienes que mostrar el nombre de usuario del usuario que ha accedido.

Además, la Página detalle foto, que muestra todos los datos de una foto seleccionada en la página con el listado resultado de una búsqueda, sólo debe ser visible para aquellos usuarios que se hayan registrado e identificado. Los usuarios no registrados pueden ver el listado, pero no el detalle de cada foto.

Por último, en el menú de usuario registrado tienes que añadir la opción Salir para que finalice la sesión del usuario e impida un acceso posterior sin antes volver a introducir un nombre de usuario y una contraseña o volver a acceder como usuario recordado en el equipo.

Nota

La parte privada de la aplicación y su integración con la parte pública la puedes plantear de varias formas. Dos formas típicas son:

En la realización de esta práctica puedes aplicar cualquiera de estas dos estrategias o cualquiera similar.


¿Cómo lo hago?

Cookies

Una cookie es un fragmento de información que un navegador web almacena en el disco duro del visitante a una página web. La información se almacena a petición del servidor web, ya sea directamente desde la propia página web con JavaScript o desde el servidor web mediante las cabeceras HTTP, que pueden ser generadas desde un lenguaje de web scripting como PHP. La información almacenada en una cookie puede ser recuperada por el servidor web en posteriores visitas a la misma página web.

Las cookies resuelven un grave problema del protocolo HTTP: al ser un protocolo de comunicación "sin estado" (stateless), no es capaz de mantener información persistente entre diferentes peticiones. Gracias a las cookies se puede compartir información entre distintas páginas de un sitio web o incluso en la misma página web pero en diferentes instantes de tiempo

En PHP se emplea la función setcookie() para asignar valor a una cookie. El prototipo de esta función es:

bool setcookie(string $name [, string $value [, int $expire [, string $path [,
               string $domain [, bool $secure [, bool $httponly]]]]]]) 

Para borrar una cookie, se tiene que asignar a la cookie una fecha de caducidad (expire) en el pasado, es decir, una fecha anterior a la actual.

Para recuperar el valor de una cookie se emplea el array predefinido $_COOKIE con el nombre de la cookie como índice. También se puede emplear $_REQUEST, que contiene la unión de $_COOKIE, $_POST y $_GET.

En la siguiente página se cuenta el número de visitas que realiza un usuario al visitar la página; este contador conserva su valor durante un año aún a pesar de que un usuario cierre el navegador y tarde días en volver a visitar la página:

<?php
  if(isset($_COOKIE['contador']))
  { 
    // Caduca en un año 
    setcookie('contador', $_COOKIE['contador'] + 1, time() + 365 * 24 * 60 * 60); 
    $mensaje = 'Número de visitas: ' . $_COOKIE['contador']; 
  } 
  else 
  { 
    // Caduca en un año 
    setcookie('contador', 1, time() + 365 * 24 * 60 * 60); 
    $mensaje = 'Bienvenido a nuestra página web'; 
  } 
?> 
<?xml version="1.0" encoding="iso-8859-1"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title>Prueba de cookie</title> 
</head> 
<body> 
<p> 
<?php echo $mensaje; ?> 
</p> 
</body> 
</html> 

En el código anterior, fíjate cómo se emplea la función isset() para comprobar si una variable ha sido inicializada.

Importante: las cookies se envían al cliente mediante encabezados HTTP. Como cualquier otro encabezado, las cookies se deben enviar antes que cualquier salida que genere la página (antes que <html>, <head> o un simple espacio en blanco).

Sin embargo, se puede emplear un buffer de salida para almacenar (retener) la salida generada, en cuyo caso se puede enviar un encabezado en cualquier momento, pero con la sobrecarga que supone por un lado almacenar en el servidor toda la salida antes de ser enviada y por otro lado no recibir la página en el cliente hasta que el código PHP no haya terminado completamente. Esto se puede lograr con las funciones ob_start() y ob_end_flush() en la propia página, o configurando el parámetro output_buffering en el fichero php.ini.

Sesiones

Una sesión es un mecanismo de programación de las tecnologías de web scripting que permite conservar información sobre un usuario al pasar de una página a otra. A diferencia de una cookie, los datos asociados a una sesión se almacenan en el servidor y nunca en el cliente.

En la mayoría de las tecnologías de web scripting, las sesiones se implementan mediante una cookie que almacena un valor que identifica al usuario en el servidor web cada vez que pasa de una página web a otra. En el servidor web están almacenados todos los datos de la sesión y se accede a ellos cada vez que se pasa de página gracias al identificador almacenado en la cookie.

En Mozilla Firefox podemos ver las cookies que tenemos almacenadas, con su valor y fecha de caducidad. En la Figura 3 podemos ver la cookie PHPSESSID que se emplea en PHP para almacenar el identificador de una sesión. Además, el siguiente código de PHP muestra el identificador de una sesión y el nombre de la cookie que almacena la sesión:

<?php 
  session_start(); 
  echo 'session_id(): ' . session_id(); 
  echo "<br />\n"; 
  echo 'session_name(): ' . session_name(); 
  echo "<br />\n"; 
  print_r(session_get_cookie_params()); 
?>
Figura 3: Cookie que almacena el identificador de sesión

El siguiente ejemplo cuenta el número de visitas que realiza un usuario a una página web. A diferencia del contador realizado con una cookie en el ejemplo anterior, este contador sólo funciona durante el tiempo de existencia de la sesión, si el usuario cierra el navegador y vuelve a acceder a la página, el contador se reiniciará desde uno:

<?php 
  session_start(); 
  if(isset($_SESSION['contador'])) 
  { 
    $_SESSION['contador'] = $_SESSION['contador'] + 1; 
    $mensaje = 'Número de visitas: ' . $_SESSION['contador']; 
  } 
  else 
  { 
    $_SESSION['contador'] = 1; 
    $mensaje = 'Bienvenido a nuestra página web'; 
  } 
?> 
<?xml version="1.0" encoding="iso-8859-1"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">  
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title>Prueba de cookie</title> 
</head> 
<body> 
<p> 
<?php echo $mensaje; ?> 
</p> 
</body> 
</html>

Para destruir una sesión y toda la información que contiene lo mejor es borrar explícitamente toda la información contenida en el array $_SESSION, borrar la cookie que contiene el identificador de la sesión y por último destruir la sesión:

<?php 
  // Borra todas las variables de sesión 
  $_SESSION = array(); 
  // Borra la cookie que almacena la sesión 
  if(isset($_COOKIE[session_name()])) { 
    setcookie(session_name(), '', time() - 42000, '/'); 
  } 
  // Finalmente, destruye la sesión 
  session_destroy(); 
?> 

Para controlar el acceso a una página web de una zona privada se suele emplear una variable de sesión que se inicializa con cierto valor en la página de control de acceso; en las páginas donde se quiere controlar si el usuario tiene permiso para acceder se consulta el valor de la variable de sesión para ver si tiene el valor esperado. Si no contiene el valor esperado, lo normal es mostrar una página con un mensaje de error o redirigir al usuario a la página principal del sitio web.


Recomendaciones

Recuerda que las páginas que contengan código PHP tienen que tener la extensión .php. Si modificas alguna página web que ya tengas hecha de prácticas anteriores para añadirle código PHP, tendrás que cambiarle la extensión y corregir todos los enlaces que apunten a esa página.

Recuerda que para que el código PHP se ejecute, la página web tiene que pasar por el servidor web para que éste se la pase al intérprete de PHP. Para ello, tienes que cargar la página a través del servidor web: la URL de conexión tiene que tener la forma http://localhost.

Recuerda que debes poner al principio de la página session_start() en todas las páginas donde quieras utilizar las sesiones. Si no lo pones y accedes a la variable $_SESSION no obtendrás ningún resultado.

Recuerda que en PHP puedes emplear las funciones include() y require() para reutilizar código entre diferentes páginas:

Almacenar el nombre de usuario y la contraseña de usuario registrado directamente en una cookie no es una buena práctica, ya que supone un problema de seguridad porque cualquier persona que use el ordenador donde se almacena puede tener acceso a esos datos. Una solución puede ser almacenar los datos encriptados o, mucho mejor, no almacenar directamente los datos, sino algún tipo de identificador (también encriptado) asociado con el usuario en el servidor.

Si se está empleando un ordenador compartido no se debe activar la opción de "recordarme en este equipo", porque entonces cualquier persona que utilice el ordenador podrá acceder con el perfil de usuario almacenado. Cuando utilices un ordenador compartido, emplea la opción Limpiar información privada... en Mozilla Firefox o Eliminar el historial de exploración... en Microsoft Internet Explorer para eliminar todo rastro de tus datos personales y de tu actividad en el navegador.


Recursos

¿Qué son las cookies?

¿Cómo se emplean las cookies con PHP?

¿Qué son las sesiones?

¿Cómo se emplean las sesiones con PHP?