Seguridad de cookies


Las cookies de hoy en día son una parte vital de la navegación en Internet. Son una forma de realizar un seguimiento de tus movimientos dentro de un sitio y almacenar datos directamente en tu navegador web. Mantenerlas lo más seguras posible, evita que personas malintencionadas secuestran tus sesiones web y roban nuestra identidad.

¿Qué son las cookies?

Las cookies ayudan a realizar un seguimiento de tus movimientos dentro de un sitio web, te ayudan a continuar justo en el punto donde lo dejaste, a recordar preferencias y otras funciones de personalización. Una de esas cookies transmitidas entre el servidor y el navegador web se denomina cookie de sesión. Lo que hace es básicamente contener tu identidad virtual y recordar los datos de inicio de sesión que registraste. Si tu cookie de sesión (o ID de sesión, cookie de autenticación) para un sitio web es robada, el que la robó podría usarla para suplantarte en ese mismo sitio web e iniciar sesión con tu identidad. Por lo tanto, es muy importante mantener seguros esas pequeñas fuentes de datos.

¿Por qué usar cookies?

Las cookies hacen que navegar por internet sea más conveniente. La comodidad de insertar tu nombre de usuario y contraseña solo una vez durante una sesión de navegación hace que la experiencia sea mucho mejor. Sin cookies, las credenciales de inicio de sesión tendrían que ingresarse cada vez antes de agregar un producto a tu carrito o lista de deseos cuando se utiliza una tienda online.

Las cookies se encuentran en los Encabezados HTTP

Los encabezados HTTP permiten que se pase información adicional entre el navegador web y el servidor como solicitudes o respuestas. Existen muchos tipos diferentes de [encabezados HTTP] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). Cuando el servidor quiere configurar una cookie, devuelve un encabezado llamado “Set-Cookie” con el par clave-valor y algunas opciones. En solicitudes posteriores, el navegador enviará su propio encabezado para que el servidor web sepa el nombre y el valor de sus cookies almacenadas. El servidor no continuará enviando las cookies, solo las enviará si hay un cambio.

Cookie visible en el encabezado de Chrome

HTTP vs HTTPS

Antes de continuar con las cookies, debemos dejar claro qué es HTTPS y por qué es más seguro que HTTP.

El protocolo de transferencia de hipertexto o simplemente HTTP es el protocolo subyacente utilizado por la World Wide Web. HTTP define cómo se formatean y transmiten los mensajes, y qué acciones deben tomar los servidores web y los navegadores en respuesta a varios comandos. Por ejemplo, cuando ingresas una URL en tu navegador, esto realmente envía un comando HTTP al servidor que lo dirige a buscar y transmitir la página web solicitada.

HyperText Transfer Protocol Secure o simplemente HTTPS es la versión segura de HTTP, el protocolo a través del cual se envían los datos entre tu navegador y el sitio web al que estás conectado. La ‘S’ al final de HTTPS significa ‘Seguro’. Significa que todas las comunicaciones entre tu navegador y el sitio web están encriptadas.

HTTPvsHTTPS

…Ahora, volvamos a las cookies

Si se usa HTTPS en lugar de HTTP, un atacante que esté espiando a escondidas en la red no puede ver la cookie porque está encriptada. Cualquiera puede decir que esta es la opción más segura de las dos. El problema entra en juego cuando un sitio web está disponible tanto a través de HTTP como HTTPS o cuando un sitio es susceptible a Cross Site Scripting o XSS (aprenda sobre XSS en nuestro blog). El robo de cookies y sesiones incluso se ha hecho más fácil y ahora está disponible a través de aplicaciones como Firesheep.

HttpOnly

Si un sitio web tiene una vulnerabilidad XSS, un atacante puede obtener la cookie de sesión inyectando código malicioso en un campo de formulario en la página web. Más sobre eso en nuestra publicación del blog sobre XSS Una forma de ayudar contra la vulnerabilidad XSS es habilitar la bandera HttpOnly en el lado del servidor. Esto no permitirá que JavaScript lea ninguna de las cookies. Pero tenga en cuenta que este no es un método 100% seguro contra XSS ya que las cookies del sitio web podrían ser susceptibles a algunas formas de XSS como Cross Site Tracing. Además, XSS se puede utilizar para robar otros datos, no solo cookies.

Cuando se utiliza el protocolo HTTP, las cookies se pasan en texto sin formato, lo que permite a un atacante robar y/o modificar los datos. Cuando se usa HTTPS, este no podrá ver los datos. Los problemas comienzan cuando un sitio web usa HTTP y HTTPS. En estos casos, la cookie que de otro modo se cifra con HTTPS se envía a las páginas HTTP sin el cifrado. Para evitar que el cliente web envíe más cookies en texto plano a través de HTTP, el indicador seguro debe estar habilitado desde el lado del servidor. Lo que hace esto es restringir el envío de información de cookies solo a través de HTTPS.

¿Cómo las mantengo seguras?

Hay varias maneras de mantener sus cookies seguras, principalmente mediante la adición de banderas adicionales al encabezado de la cookie. Esto se puede hacer escribiendo la configuración del indicador en el código o configurando el servidor web para que lo haga más adelante.

¿Cómo configuro las banderas en el código?

En PHP puedes establecer los argumentos para las cookies a través de argumentos opcionales en la función “setcookie”. Dentro de esa función hay 2 opciones booleanas: secure y httponly. Ambas deben establecerse en “verdadero”.

// Options
setcookie( name, value, expire, path, domain, secure, httponly);

// Example
setcookie('UserName','Peter',0,'/www','www.example.com',true,true);

Para cambiar los valores de las cookies de sesión, puedes utilizar la función “session_set_cookie_params”, que debe llamarse antes de que se inicie la sesión. De nuevo, las opciones secure y httponly deben establecerse en “verdadero”.

// Options
session_set_cookie_params( expire, path, domain, secure, httponly);

// Example
session_set_cookie_params(0,'/www','www.example.com',true,true);

… o en el archivo PHP.ini

Otra opción es establecer los valores en el archivo php.ini. Luego, simplemente estableces session.cookie_httponly y session.cookie_secure como “verdadero”.

session.cookie_httponly = True
session.cookie_secure = True

Entonces, en conclusión

La configuración de las banderas secure y httponly para cookies ya no es una opción, es una necesidad para todos los desarrolladores. Especialmente si se toma en cuenta que configurarlas es realmente muy fácil. Sin esas medidas de seguridad, todas las cookies en tu aplicación web serán susceptibles al secuestro.

Roland Kaur