Uso de Cookies PHP

Aprende todo sobre las Cookies Web en PHP

tipos de variables

Este nuevo tutorial introduce el mecanismo de las cookies en PHP.

Definiremos juntos lo que es una cookie y para qué se usa. Luego discutiremos los principios de seguridad relacionados con las cookies. Más tarde aprenderemos a generar y leer el contenido de una cookie. Terminaremos este tutorial sobre el borrado de la cookie, almacenando valores de tipo complejo por serialización/deserialización antes de concluir sobre los casos de uso más frecuentes.

¿Qué es una Cookie web?

El mecanismo de Cookies fue inventado por la empresa Netscape con el fin de superar ciertas debilidades del protocolo HTTP, pero también para ampliar las posibilidades de la relación entre el cliente y el sitio web. Su función es el almacenamiento, durante un período de tiempo determinado, de información sobre el usuario (su apodo, fecha de última conexión, edad, preferencias...).

En la práctica, las cookies son simples archivos de texto que no pueden exceder de 4KB. Se almacenan en el disco duro del usuario y son administrados por los navegadores (Firefox, Internet Explorer, Safari, Opera, AvantBrowser...). Su aceptación está sujeta a los filtros de los navegadores. De hecho, estos últimos son capaces de rechazar las galletas. Por lo tanto, su uso debe ser escrupulosamente considerado.

Por razones de seguridad, los "estándares" han fijado en 20 el número máximo de cookies enviadas para un mismo dominio.

¿Qué hay de la seguridad?

Hasta hace unos años las cookies daban miedo. Algunos usuarios estaban convencidos de que eran peligrosos, de que podían ejecutar programas maliciosos en sus ordenadores o recuperar información personal o confidencial. No es así. Una Cookie es nada más y nada menos que un archivo de texto muy pequeño.

No puede ser ejecutado o incluso ejecutar programas por sí mismo. Sólo se utiliza para almacenar información para su posterior reutilización.

Por otra parte, nada impide que un programa pirata sea ejecutado por el usuario (pero sin su conocimiento) que recuperará información confidencial o personal, para luego almacenarla en una cookie que crea y envía al servidor web. Este último recuperará entonces la información transmitida y la utilizará contra el usuario.

La creación de una Cookie requiere, sin embargo, el respeto de algunas normas de seguridad y de sentido común. Como la cookie se almacena en el disco duro del cliente, el acceso a ella no es seguro. Una cookie puede ser leída, modificada o eliminada sin dificultad por un usuario malintencionado. Por lo tanto, se aconseja encarecidamente no almacenar información sensible como:

  • Información confidencial en su interior (por ejemplo, la contraseña).
  • Identificadores de inicio de sesión fácilmente identificables como un inicio de sesión.

Por lo general, una cookie sólo debe utilizarse con fines estadísticos, para personalizar la pantalla o para la multipágina de los formularios. E incluso en este último caso, la mejor solución sería utilizar el mecanismo de sesión.

Generación de galletas con setcookie()

La creación de una cookie se basa en el envío de cabeceras HTTP al navegador del cliente usando la función setcookie(). Esto implica que debe ser llamado antes de que se envíe cualquier dato al navegador (print(), echo(), etiqueta html, espacio en blanco...) de lo contrario se generará un error del tipo "Advertencia: No se puede enviar la cookie de sesión - los encabezados ya han sido enviados...". ».

La función setcookie() puede recibir hasta 7 parámetros. Sólo el primero es obligatorio porque define el nombre de la galleta.

Devuelve un booleano: verdadero si tiene éxito y falso si no lo tiene.

Definición de la función setcookie

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

El siguiente indicador ilustra la creación de una cookie con un nombre, un valor y una fecha de validez de un mes. Simula el registro del diseño de un sitio que el usuario prefiere. Gracias a esta cookie, el sitio se mostrará con este tema gráfico automáticamente la próxima vez que el usuario visite el sitio.

Ejemplo de uso básico:

<?php
  // Creación de una cookie
  setcookie('cookie_prueba','valor de la cookie',time()+3600*24*31);
?>

1] Cuando se crea una cookie de una página, sólo está disponible en la página siguiente (en la siguiente visita) porque el navegador debe enviar la cookie al servidor.
2] Una cookie con una fecha de caducidad no especificada se almacena en la RAM del ordenador y no en el disco duro. Se borrará cuando se cierre el navegador.

Lectura de uan cookie

Cuando un usuario de Internet consulta un sitio web identificado por un nombre de dominio, su navegador envía al servidor una lista de cookies disponibles para ese dominio. PHP los recibe y luego construye un arreglo asociativo superglobal llamado $_COOKIE.

Las claves corresponden a los nombres de las cookies y los valores a los valores escritos en ellas. Entonces se vuelve muy simple acceder al valor de una cookie llamando a la matriz $_COOKIE con la clave apropiada. El siguiente ejemplo nos permite recuperar el valor de la cookie que creamos anteriormente.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es">
<html>
  <head>
    <title>Lectura de una cookie !</title>
  </head>
  <body>
    <p>
      El valor de tu cookie es: 
      <?php 
        // Lecture de la valeur du cookie designPrefere
        echo $_COOKIE['cookie_prueba'];    // Muestra el valor "valor de cookie"
      ?>
    </p>
  </body>
</html>

Observaciones :

1] Añadir un par clave/valor a la matriz $_COOKIE no crea una nueva cookie.
2] Para cambiar el valor de una cookie, tienes que reutilizar la función setcookie().
[3] Para saber todas las cookies usadas, tienes que listar la matriz $_COOKIE usando un bucle foreach() o una llamada a print_r().

Cómo borrar Cookies en PHP

Para borrar una cookie, tienes que llamar la función setcookie() de nuevo, pasando el nombre de la cookie sólo como un parámetro. En nuestro ejemplo, usaremos el siguiente código para borrar nuestra cookie de DesignPrefere.

<?php
  // Borrado de la cookie
  setcookie('cookie_prueba');
?>

El código anterior le dice al navegador que borre la cookie pero no borra el valor de la tabla $_COOKIE. Por lo tanto, debe recordar borrar ambos. Para ello, utilizamos el siguiente ejemplo.

<?php
  // Borrado de la cookie creada
  setcookie('cookie_prueba');
  // Borrado de la clave de la variable COOKIE
  unset($_COOKIE['cookie_prueba']);
?>

Almacenar valores complejos en una Cookie

Hasta ahora hemos almacenado un valor simple de cadena en nuestra cookie. Así que es un tipo primitivo. Pero también es posible almacenar un conjunto complejo en una cookie.

Para realizar esta operación, es necesario transformar la cookie en una cadena de caracteres y luego reconstruirla cuando se recibe. Esto se denomina serialización (o plegado, clasificación) y deserialización (o despliegue o desclasificación). Ambas operaciones se realizan utilizando las funciones serialize() y unserialize().

Ilustremos estos principios con un ejemplo que simula el lanzamiento de un dado. Nuestra galleta se llamará "rollFrom". También simularemos el lanzamiento de los dados con la función rand(). Todos los lanzamientos se almacenarán en un vector (matriz unidimensional indexada numéricamente) que serializaremos/deserializaremos en la cookie.

Simulación de tiradas de dados y registro de puntuaciones en una cookie:

<?php
  // Definición de las estructuras
  $nombreLancesDe = 0;      // Número de lanzamientos
  $listeSerialisee = '';      // Cadena de serialización de la cookie
  $listeLancesDe = array();    // Tabla de valores de los lanzamientos
 
  // Comprobación de la existencia de la variable
  if(!empty($_COOKIE['lancesDe']))
  {
    // Recuperar el valor de la cookie en la variable $listeLancesDe para la desealización
    $listaSerializada= $_COOKIE['lanzamientos'];
    $listaDeLanzamientos= unserialize($listaSerializada);
  }
 
  // Almacenamos cada lanzamiento
  $listaDeLanzamientos[] = rand(1,6);
  // Serializar de nuevo el array
  $listaSerializada= serialize($listaDeLanzamientos);
  setcookie('lanzamientos', $listaSerializada, time()+3600*24);
  // Calcular el número de lanzamientos
  $numeroDeLanzamientos= count($listaDeLanzamientos);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
 <head>
   <title>Simulación de lanzamientos de un dado!</title>
 </head>
 <body>
    <p>
     Has lanzado el dado <?php echo $nombreLancesDe; ?>  veces con los siguientes resultados :
    </p>
    <?php
      if($numeroDeLanzamientos> 0)
      {
        echo '<ul>';
        // Recoerremos el array de lanzamientos
        foreach($listaDeLanzamientos as $numeroDeLanzamientos => $valor)
        {
          echo '<li>Lanzamiento n#', ($numeroDeLanzamientos+1) ,' : ', $valor,'</li>';
        }
        echo '</ul>';
      }
    ?>
  </body>
</html>

Llamando al script cinco veces, simulamos cinco tiradas de dados. El resultado es similar a este:

Has lanzado el dado 6 veces con los siguientes resultados:
 
* Lanzamiento #1 : 4
* Lanzamiento#2 : 6
* Lanzamiento#3 : 3
* Lanzamiento#4 : 3
* Lanzamiento #5 : 3
* Lanzamiento#6 : 2

Los principales casos de uso de cookies

Por lo tanto, las cookies son muy útiles en casos especiales. Entre ellos, podemos enumerar:

  1. Guardar el diseño preferido de un sitio web para que lo use un usuario.
    la visualización de nuevos mensajes desde la última visita del usuario de Internet
  2. La exhibición de mensajes no leídos por el visitante en un foro.
  3. La fragmentación de un formulario en varias páginas. Los valores enviados en la primera página se serializan y se envían por cookie a la segunda página que los deserializará.
  4. Contadores de visitas.
  5. Reconocimiento de los visitantes que ya han votado en una encuesta

Recordaremos que las cookies son una forma efectiva de retener pequeñas cantidades de información sobre un usuario. Sin embargo, por razones de seguridad, su tamaño se limita a 4KB y su número a 20 para el mismo dominio.

Por consiguiente, no deben utilizarse para transferir grandes cantidades de datos, sino únicamente para almacenar información con fines estadísticos o para mostrar personalizaciones.

Sobre el autor

Javier Gómez Redactor en Srcodigofuente.es

Javier Gómez

Ingeniero técnico en informática de gestión. Desarrollador web freelance y profesor de desarrollo web a partes iguales. Testarudo autodidacta, creativo, perfeccionista y alma libre.

Utilizamos "cookies" para información estadística. Si continúas navegando aceptas su uso.