Las cookies son una herramienta esencial en el desarrollo web para almacenar pequeños fragmentos de datos que permiten la personalización y la mejora de la experiencia del usuario. Comprender cómo manipularlas y configurar sus parámetros adecuadamente es fundamental para cualquier desarrollador web interesado en crear aplicaciones robustas y seguras.
¿Cómo se define una cookie?
Para definir una cookie en PHP, utilizamos la función setcookie(), que permite establecer varios parámetros esenciales. Comencemos con un ejemplo básico para crear una cookie en PHP:
<?phpsetcookie('example-cookie',// nombre de la cookie'un michi salvaje',// valor de la cookietime()+(60*60*24),// expire en un día'/',// path'localhost',// dominiofalse,// secure (SSL)true// HTTP only);
¿Qué parámetros podemos configurar en una cookie?
Nombre y Valor: Son los aspectos más fundamentales. El nombre identifica la cookie y el valor almacena la información que queremos guardar.
Expires: Define el tiempo de expiración de la cookie. Si se establece en cero, la cookie se eliminará cuando se cierre el navegador. Podemos calcular el tiempo de expiración en unidades de segundos usando una marca de tiempo UNIX a través de la función time():
En 1 minuto: time() + 60
En 1 hora: time() + (60 * 60)
En 1 día: time() + (60 * 60 * 24)
Path: Especifica la ruta en la que la cookie es disponible. Si configuramos el path como '/', la cookie estará disponible en todo el dominio. Por ejemplo, si definimos '/configuración', la cookie solo estará accesible en esa ruta y en las que le siguen jerárquicamente.
Domain: Determina el dominio en el que la cookie es válida. Puede restringirse a subdominios específicos como cookie.platzi.com.
Secure: Si está configurado en true, la cookie solo será enviada a través de conexiones HTTPS, garantizando así su seguridad. Debe quedar en false al trabajar en localhost ya que usualmente no cuenta con un certificado SSL.
HTTP Only: Determina si la cookie está accesible a través de lenguajes del lado del cliente como JavaScript. Al ponerlo en true, solo estará disponible del lado del servidor, añadiendo una capa adicional de seguridad.
¿Cómo afectan las rutas (path) y dominios a la disponibilidad de las cookies?
Un punto crucial al trabajar con cookies es entender cómo las rutas y los dominios afectan su disponibilidad. Si una cookie está definida para un específico path, solo estará accesible en esa ruta y en las subrutas que hereden el prefijo de esa ruta.
Ejemplo:
Definimos una cookie con path como '/configuración':
Disponible en '/configuración' y '/configuración/admin'
No disponible en '/otra-ruta'
Esto nos permite un control granular sobre dónde las cookies pueden ser utilizadas dentro de nuestra aplicación.
Recomendaciones para trabajar con cookies
Seguridad: Siempre considera la configuración secure y HTTP only para proteger la información.
Optimización: No almacenes grandes cantidades de datos, ya que las cookies tienen un tamaño limitado.
Expiración: Define adecuadamente la expiración para garantizar la validez de la información que contiene.
Convirtiéndote en un experto en el manejo de cookies, puedes mejorar significativamente la seguridad y la operación de tus aplicaciones web. ¡Sigue explorando, y nunca dejes de aprender sobre las fascinantes capacidades del desarrollo web!
Me parece que el httponly lo explicaste al reves, true quiere decir que no lo pueden leer desde javascript. Y false si los deja leer. O al menos eso dice la doc de php.
Es verdad, también confunde subdominio con path
En el caso del subdominio hay que tener en cuenta el domain, eso incluye los subdominios.
Parámetros que admite el método setcookie():
name:
value:
expires_or_options:
path:
domain:
secure:
httponly:
En los dos úlitmos cursos que he hecho vas siempre 3-4 días por delante de mi según lo que veo por tus comentarios :D
jajajaj que bien Jorge contar con un compañero de estudio en la misma ruta 💪
Ya que estamos trabajando con las cookies, quiero compartirles unos apuntes (buenas practicas) sobre seguridad (para prevenir los ataques XSS):
.
-Si las usas no poner datos sensibles (solamente usarse preferencias de usuario, ejemplo: modo dia, modo noche )
Siempre poner fecha de expiracion
Siempre poner el dominio y el path
Usar solamente en HTTPS
.
Es mejor usar sessiones del lado del servidor que cookies del lado del cliente.
.
Otras recomendaciones, para tener en cuenta (de manera informativa, porque no es el scope del curso) pero es la forma profesional de lidiar con las cookies:
.
Encriptar los datos que van en la cookie
Ademas de la encritacion firmarlas, usando hash.
Excelente aporte, lo tendré muy en cuenta, brinda diferentes perspectivas acerca del tema y mucho más contexto.
La parte de httponly está al revés
(Documentación oficial)
httponly
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. Se ha indicado que esta configuración ayuda efectivamente a reducir el robo de identidad a través de ataques XSS (aunque no es soportada por todos los navegadores). pero esa afirmación se disputa a menudo. Agregado en PHP 5.2.0. Puede ser true o false
Lástima que no revisen el contenido antes de subirlo
También confunde subdominio con path
.
Platzi debería revisar mejor el contenido
Comparto la idea de httponly, pero en el caso de lo que menciona del path si tiene razón, solo que no lo supo explicar.
Lo que pasa es que si en domain ponemos ejemplo.com con path “/” eso hará que esté disponible en todos los subdominios. Eso es lo que se menciona en la documentación.
soy tu fan :3
Los parámetros que se están usando en la función setcookie() son los siguientes:
name: El nombre de la cookie, en este caso "example".
value: El valor de la cookie, en este caso "Michi_salvaje".
expires_or_options: La fecha de expiración de la cookie expresada en formato Unix timestamp. En este caso se ha establecido en 0, lo que significa que la cookie expirará al finalizar la sesión.
path: La ruta dentro del servidor a la que la cookie está disponible. En este caso se ha establecido en "/" lo que significa que la cookie está disponible en todo el sitio.
domain: El dominio para el que la cookie está disponible. En este caso se ha establecido en "localhost".
secure: Un valor booleano que indica si la cookie sólo está disponible en conexiones seguras (https). En este caso se ha establecido en false.
httponly: Un valor booleano que indica si la cookie puede ser accedida por el frontend con js
En este momento deberíamos trabajar con cookies en vez de sessions? o depende el proyecto?
entiendo que depende del proyecto, dado que las cookies se trabajan del lado del cliente y las sesiones del lado del servidor.
Según el caso, las sesiones son para: por ejemplo mantener los datos de un usuario autenticado, por lo general los servicios de hosting tienen predefinido que después de X cantidad de tiempo esa sesión se borra automáticamente. Las cookies son algo que puede durar mucho más tiempo y solo se puede usar para no almacenar datos no sensibles.
RetaxMaster se ha equivocado al explicar httponly, según La documentación de setcookie si es true "será accesible por lenguajes de scripting, como JavaScript"
La función setcookie() en PHP permite crear y configurar cookies. Puedes definir su:
name: Nombre de la cookie.
value: Contenido de la cookie.
expires: Cuándo expira (marca de tiempo Unix). Un valor de 0 significa que expira al cerrar el navegador.
path: Ruta del servidor donde la cookie estará disponible. / la hace disponible en todo el sitio.
domain: Dominio donde la cookie es válida.
secure: Si es true, solo se envía con HTTPS.
httponly: Si es true, no se puede acceder desde JavaScript (solo desde el servidor).
Para más detalles, consulta la documentación de PHP o la clase "Manejo de Cookies en PHP para Personalización Web".
¿Cómo ha quitado la extensión .php de la url?
Al definir tu archivo como index.php y al hacer referencia a la ruta en este caso la carpeta: /configuracion, por default busca el archivo index.php y no es necesario indicarlo de manera explicita. Caso contrario si el archivo se llamara por ejemplo test.php, si se tendria que indicar la ruta completa como: /configuracion/test.php
El parámetro httpOnly en la función setcookie() de PHP es una medida de seguridad importante. Te explico sus características principales:
### Propósito principal:
- Previene que el cookie sea accesible mediante JavaScript del lado del cliente
- Protege contra ataques XSS (Cross-Site Scripting)
- La cookie SOLO puede ser accedida por el servidor
- JavaScript no puede leer la cookie usando document.cookie
- Ayuda a prevenir el robo de cookies mediante scripts maliciosos
### Ejemplo práctico de seguridad:
// Menos seguro (sin httpOnly)setcookie("sessionId","abc123",time()+3600,"/");// Más seguro (con httpOnly)setcookie("sessionId","abc123",time()+3600,"/","",true,true);
### Cuándo usarlo:
- Recomendado para cookies que contienen:
- IDs de sesión
- Tokens de autenticación
- Información sensible
- No usar cuando necesites acceder a la cookie desde JavaScript
Es una buena práctica de seguridad habilitar httpOnly en todas las cookies que no necesiten ser accedidas desde JavaScript.
Para los que se encuentran en un futuro, el httponly se ha explicado incorrectamente. Es exactamente lo que el dijo pero al revés.
super interesante...
<?php
setcookie(name:"example_cookie",value:"Michi salvaje",expires_or_options:time()+60*60*24,// 0 La cookie estara viva mientas la sesion, time() en tiempo inmediatopath:"/configuracion",// url en la que estara disponible la cookie, si se deja solo / la cookie estara disponible ewdomain:"localhost",// dominio en el que estará disponiblesecure:false,//la cookie podra definirse solo si el dominio tiene sslhttponly:true// puede ser accedida desde Front, en flase estara disponible solo en server side);?>