Las cookies son pequeños fragmentos de información almacenados por el navegador en el equipo del suauario. La información almacenada en la cookie se utiliza para identificar un usuario y esta información se envía al servidor con cada solicitud realizada, para que el servidor pueda hacer uso de ella. Las cookies pueden almacenar una gran variedad de datos, como tu nombre, la fecha de tu última visita, tu carrito de la compra, etc. Las cookies almacenados por un sitio web no pueden ser accesibles por otros sitios web, lo que hace que las cookies sean relativamente seguras para almacenar información personal. Aún así, no es nada aconsejable utilizar cookies para almacenar información confidencial, como contraseñas, datos de tarjetas de crédito, etc.
No hay ninguna cookie cuando el navegador se conecta por primera vez a un servidor en particular. Cuando la solicitud se realiza al script PHP del servidor, éste hace una llamada a la función setcookie(). Esta provoca un encabezado HTTP Set-Cookie que será enviado en la respuesta y que contiene el nombre y el valor de la cookie para establecerse.
PHP proporciona acceso a las cookies a través de una función denominada setcookie() y la array superglobal $_COOKIE. setcookie() almacena datos en las cookies, y $_COOKIE recupera los valores de las cookies.
La función setcookie() se utiliza para establecer un valor y, opcionalmente, la fecha de caducidad de una cookie. La sintaxis de la función es:
setcookie(nombre, valor, expira, path, dominio, seguro, httponly)
- nombre: Obligatorio. Especifica el nombre de la cookie.
- valor: Obligatorio. Especifica el valor de la cookie.
- valor: Obligatorio. Especifica cuando expira la cookie.
time()+3600*24*30 establecerá que la cookie expira en 30 días. Si no se establece este parámetro, la cookie expirará al final de la sesión (cuando se cierra el navegador).
- path: Opcional. Especifica la ruta del servidor de la cookie.
Si se establece "/", la cookie estará disponible en todo el dominio. Si se establece a "/test/", la cookie sólo estará disponible en el directorio "test" y todos los subdirectorios de "test". El valor predeterminado es el directorio en el que se ha establecido la cookie.
- dominio: Opcional. Especifica el nombre de dominio de la cookie.
Para hacer la cookie disponible en todos los subdominios de ejemplo.com, deberás establecer este parametro a ".ejemplo.com". Estableciendolo a "www.ejemplo.com" hará que la cookie sólo esté disponible en el subdominio www.
- seguro: Opcional. Especifica si la cookie sólo debe ser transmitida a través de una conexión HTTPS segura. TRUE indica que la cookie sólo se establecerá si existe una conexión segura. El valor predeterminado es FALSE.
- httponly: Opcional. Cuando es TRUE la cookie será accesible sólo a través del protocolo HTTP. Esto significa que la cookie no será accesible por lenguajes de scripting, como JavaScript.
Veamos un ejemplo de como establecer una cookie en PHP:
<?php
$mi_cookie = "my first cookie";
$expira = time() + (60 * 60 * 8);
// Establece una cookie que expira en 8 horas
setcookie("PrimeraCookie", $mi_cookie, $expira);
?>
La cookie caducará en 8 horas (segundos x minutos x horas a partir de la hora actual). Pero ¿qué pasa si deseas que tu cookie se elimine inmediatamente o una vez que la información sea obtenida por el navegador? Puedes establecer la fecha de caducidad a un tiempo en el pasado. Por ejemplo, puedes establecer $expira como time()-3600.
Las cookies por defecto se establecen sólo para el directorio actual y sus descendientes. El cuarto parámetro path restringe el acceso a las cookies para una ruta en el servidor. Por ejemplo, si la cookie se establece en el directorio de "/test/" , luego estará disponible sólo para scripts alojados en el directorio de "test" y sus subdirectorios. Si deseas que la cookie se establezca para el directorio raíz, "/" debe utilizarse como parámetro de path, como en este ejemplo:
<?php setcookie("PrimeraCookie", $mi_cookie, $expira, "/");?>
El quinto parámetro domain restringe el acceso a las cookies para un dominio determinado. Por ejemplo, si deseas una cookie que sea accedible desde dos subdominios distintos como "www.webintenta.com" y "tutoriales.webintenta.com" debes establecer el parámetro domain como .webintenta.com. Haciendo esto lograremos que la cookie está disponible para ambos subdominios.
<:?php setcookie("PrimeraCookie", $mi_cookie, $expira, "/", ".webintenta.com");?>
Las cookies se envían al navegador mediante campos de encabezado en el protocolo HTTP. Debido a esto, it†™ s necesario establecer cookies antes de enviar una sola línea de código HTML o cualquier otra salida al usuario. Las cookies no se establecerá si se envía cualquier salida. En este caso, la función setcookie() devolverá false y PHP producirá un mensaje de error.
Recuperar y actualizar las cookies
Recuperar el valor de las las cookies es bastante sencillo en PHP. La matriz global $_COOKIE se utiliza para recuperar el valor de la cookie para solicitudes de páginas posteriores. Por ejemplo, si deseas mostrar el número de veces que un usuario ha visitado tu sitio web:
<?php
$visitas = 1;
if (isset($_COOKIE["visitas"])) {
$visitas = intval($_COOKIE["visitas"]);
}
setcookie("visitas", $visitas + 1, time() + (60 * 60 * 24 * 30));
echo "Has visitado está página $visitas veces.";
?>
Una cookie se borra automáticamente por el navegador una vez se sobrepasa la fecha de caducidad. Por lo tanto, establecer el parámetro de caducidad de la función setcookie() en algún momento del pasado elimina la cookie. En el siguiente ejemplo, el parámetro value se establece a null y el parámetro de expiración se establece un un tiempo pasado.
<?php
$expira = time() - 60;
setcookie("PrimeraCookie", $mi_cookie, $expira, "/", ".webintenta.com");
?>
A continuación se detalla una pequeña referencia con los números y la cantidad de tiempo que significan; lo que puede ser de utilidad para establecer la caducidad de las cookies:
- Un minuto: 60
- Diez minutos: 600
- Media hora: 1800
- Una hora: 3600
- Un día: 86400
- Una semana: 604800
- Dos semanas: 1209600
- Un mes (30 días): 2592000
- Un año (365 días): 31536000
Hay casos en que un usuario desactiva o tiene desactivadas las cookies en el navegador por razones de privacidad. Por lo tanto, antes de usar cookies, se recomienda siempre realizar una primera prueba para comprobar si el usuario tiene las cookies habilitadas o no, en el navegador. Puedes hacerlo estableciendo una cookie y luego redirigir a un siguiente página y comprobar si la cookie se recibió. Si no es así, mostrar un mensaje al usuario sugiriendo que habilitar las cookies.
Deshabilitar las cookies en un sitio que requiere cookies puede afectar a la funcionalidad del sitio. En est caso, tenemos que encontrar otras maneras para mantener dicha funcionalidad.
Cuando usamos cookies, existen unas cuantas cosas que debemos tener en cuenta:
- Un dominio puede definir multitud de cookies con diferentes nombres, pero los navegadores limitan el número de cookies por dominio (el número varía entre navegadores, pero generalmente es alrededor de 20).
- El tamaño máximo de cualquier cookie es de 4 KB.
- Aunque tú puedes establecer una caducidad para la cookie, en usuario puede eliminar cookies en cualquier momento.
- Las cookies sólo se acceden a travñes del navegador que las ha establecido. Es decir, Firefox e IE no las comparten.
Un usuario puede desactivar las cookies en su navegador.
- Las cookies se deben establecer antes de que cualquier otra salida sea enviada desde el PHP o de lo contrario recibirás un error.
El siguiente código, extraido de php.net muestra, en un ejemplo completo, el uso de las cookies con PHP. En este ejemplo,
ofrecemos a un usuario la posibilidad de elegir los colores del texto y el fondo de la página a través de un formulario. Una vez se han elegido los colores, éstos se guardan en sendas cookies por el período de una hora. Así que si el usuario visita de nuevo la página dentro de ese lapso de tiempo, el aspecto de la web será el definido por el usuario, y leído de las cookies.
<?php
// comprobar si el formulario ha sido enviado
if (isset($_POST['submitted'])){
$newbgColor=$_POST['bgColor'];
$newtxtColor=$_POST['txtColor'];
// establecer las cookies
setcookie("bgColor",$newbgColor,time()+3600);
setcookie("txtColor",$newtxtColor,time()+3600);
}
//En caso de que el usuario venga por primera vez
//y las cookies no estén fijadas
if ((!isset($_COOKIE['bgColor']) ) && (!isset($_COOKIE['txtColor']))){
$bgColor = "Black";
$txtColor="White";
}else{
#Si las cookies están fijadas las utilizamos
$bgColor = $_COOKIE['bgColor'];
$txtColor = $_COOKIE['txtColor'];
}
?>
<!-- HTML -->
<html>
<body bgcolor="<?php echo $bgColor ?>" text="<?php echo $txtColor ?>">
<form action= "<?php echo $_SERVER['PHP_SELF']; ?>" method ="POST">
<p>Color del Body:</p>
<select name=bgColor>
<option value ="Red">Rojo</option>
<option value ="Green">Verde</option>
<option value ="Blue">Azul</option>
<option value ="Yellow">Amarillo</option>
<option value ="Black">Negro</option>
<option value ="Brown">Marrón</option>
<option value ="White">Blanco</option>
</select>
<p>Color del texto:</p>
<select name=txtColor>
<option value ="Red">Rojo</option>
<option value ="Green">Verde</option>
<option value ="Blue">Azul</option>
<option value ="Yellow">Amarillo</option>
<option value ="Black">Negro</option>
<option value ="Brown">Marrón</option>
<option value ="White">Blanco</option>
</select>
<input type ="hidden" name="submitted" value="true"></br>
<input type="submit" value="remind">
</form>
</body>
</html>
También se puede crear una array de cookies mediante su definición en el nombre de la cookie. Esto tiene el efecto de establecer tantas cookies como elementos del array, pero cuando la cookie es recibida por el script, todas las cookies se colocan en un array con el nombre de la cookie:
<?php
// define las cookies
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");
// Después de volver a cargar la página, muestra
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $name => $value) {
echo "$name : $value <br />\n";
}
}
?>
Lo que da como resultado
three : cookiethree
two : cookietwo
one : cookieone
Aumentar la seguridad de las cookies
Algunos de los consejos que a continuación se ofrecen ya se han comentado de algún modo anteriormente o son fácilmente deducibles a partir de lo anteriormente explicado pero siempre es conveniente realizar un repaso y ofrecer una visión lo más clarificadora posible de cómo aumentar la seguridad de nuestra aplicación en el uso de cookies.
Habilitar la cookie únicamente a tu aplicación
El parámetro path especifica en qué rutas del sitio la cookie estará disponible. El valor predeterminado es "/", lo que significa que cada solicitud realizada obtendrá la cookie, mientras que "/foros/" limitaría la cookie sólo a esa ruta. Esta ruta se basa en la URL real que utiliza el navegador, antes de cualquier uso de mod_rewrite u otra asignación de URL.
No compartir con subdominios
El parámetro domain te permite especificar si deseas o no enviar la cookie a subdominios. Estableciendo "www.ejemplo.com" significa que únicamente en ese dominio serán accesibles las cookies, mientras que ".ejemplo.comâ" también hará que sean accesibles desde cualquier subdominio (foros.ejemplo.com, blog.ejemplo.com).
Requiere una conezión segura
Utilizando el parámetro seguro puedes indicar al navegador (u otros clientes http) que sólo se enviarán las cookies sobre conexiones SSL. Esto significa que la cookie no estará disponible para cualquier parte del sitio que no sea segura.
Proteger contra los ataques XSS
El parámetro httponly se usa para indicar que el navegador no debe permitir javascript para acceder al contenido de la cookie. Esto es principalmente una defensa contra el "cross site scripting", ya que evitará los hackers puedan recuperar y utilizar la sesión a través de dicho ataque. Este parámetro no da una garantía plena. Como mecanismo de defensa del lado del cliente se basa en el soporte que pueda ofrecer el navegador. Existen navegadores que no son compatibles con este parámetro.