Las defensas invisibles de tu web: 5 cabeceras de seguridad explicadas sin tecnicismos
Cada vez que alguien abre tu web, tu servidor le envía la página y, antes, unas líneas que el visitante no ve: las cabeceras. Algunas son instrucciones de seguridad para el navegador: «entra siempre cifrado», «no dejes que otra web me meta dentro de un marco», «no ejecutes código de sitios que no conozco».
No cuestan dinero, no cambian el aspecto de tu web y se configuran una vez. Aun así, la mayoría de webs de pymes no tienen ninguna.
1. HSTS: «entra siempre por https»
Qué hace: le dice al navegador que, durante un tiempo (normalmente un año), use siempre la versión cifrada de tu web, aunque alguien escriba http:// o pulse un enlace antiguo.
Qué evita: que alguien en una wifi pública (una cafetería, un hotel) intercepte la primera visita sin cifrar y lleve a tu cliente a una copia de tu web.
Cómo se activa: antes, comprueba que tu web funciona bien con https en todas sus páginas. Después, añade:
Strict-Transport-Security: max-age=31536000
Empieza sin includeSubDomains: si algún subdominio tuyo (por ejemplo, el de una aplicación antigua) no tiene https, dejaría de funcionar.
2. CSP: «solo ejecuta el código que yo te diga»
Qué hace: la *Content Security Policy* es una lista de sitios desde los que tu web puede cargar código, estilos, imágenes o formularios.
Qué evita: que, si alguien consigue colar un trozo de código en tu web (por un comentario, un formulario o un plugin con un fallo), ese código funcione y robe datos de tus visitantes.
Cómo se activa: es la más delicada de las cinco, porque una lista mal hecha rompe cosas (el mapa, el chat, la analítica…). El truco es empezar en modo «solo informar», que avisa sin bloquear:
Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' https: data:
Abre tu web con la consola del navegador abierta (tecla F12), mira qué avisa, añade a la lista lo que sea legítimo y, cuando no salga nada raro, cambia -Report-Only por la versión normal.
3. Protección de marcos: «no me metas dentro de otra web»
Qué hace: impide que otra web muestre la tuya dentro de un marco invisible.
Qué evita: el *clickjacking*: una web trampa pone la tuya encima, transparente, y el visitante cree que pulsa un botón inofensivo cuando en realidad pulsa «Comprar» o «Borrar» en la tuya.
Cómo se activa:
X-Frame-Options: SAMEORIGIN
O, si ya tienes CSP, añade frame-ancestors 'self' a la lista.
4. nosniff: «no adivines qué es cada archivo»
Qué hace: obliga al navegador a respetar el tipo de archivo que dice tu servidor (imagen, texto, código) en vez de intentar adivinarlo.
Qué evita: que un archivo subido a tu web como si fuera una imagen se acabe ejecutando como código.
X-Content-Type-Options: nosniff
Es la más sencilla: no rompe nada. Si solo vas a añadir una, que sea esta junto con HSTS.
5. Y una que conviene quitar: la versión del servidor
Muchos servidores anuncian en sus cabeceras qué programa usan y en qué versión: Server: Apache/2.4.41 o X-Powered-By: PHP/7.4.3. Eso no protege nada y le ahorra trabajo a un atacante: si esa versión tiene fallos conocidos, ya sabe qué probar.
- En Apache:
ServerTokens ProdyServerSignature Off. - En PHP:
expose_php = Offen elphp.ini(en muchos hostings se cambia desde el panel, en la configuración de PHP). - En Nginx:
server_tokens off;.
Y un aviso de regalo: piezas sin cifrar dentro de una web con https
Aunque tu web se abra con https://, puede cargar alguna pieza (una imagen, un script, una hoja de estilos o un formulario) desde una dirección http://. Es lo que se llama contenido mixto: el navegador bloquea parte de esas piezas (la web se ve rota o pierde el candado) y un formulario así envía lo que escribe el cliente sin cifrar.
Suele pasar en webs que se pasaron a https hace tiempo y conservan direcciones antiguas. Se arregla cambiando http:// por https:// en esas direcciones; en WordPress, con un plugin de «buscar y reemplazar» en la base de datos (haz antes una copia de seguridad). La cabecera Content-Security-Policy: upgrade-insecure-requests ayuda mientras tanto, pero no sustituye a corregirlas.
Dónde se configuran
Depende de dónde esté tu web:
- Hosting compartido con Apache (lo más común): en el archivo
.htaccessde la carpeta de tu web, con líneas comoHeader always set X-Content-Type-Options "nosniff". Algunos paneles (cPanel, Plesk) tienen un apartado para añadirlas sin tocar archivos. - WordPress: hay plugins de seguridad que las añaden desde el escritorio; comprueba después que de verdad aparecen.
- Cloudflare, Firebase, Netlify y similares: en su configuración de reglas o de cabeceras.
Haz los cambios de uno en uno y revisa tu web después de cada uno: si algo deja de funcionar, sabrás cuál ha sido.
Comprueba las tuyas
El escaneo gratis de Checkeala revisa estas cinco cabeceras en 30 segundos, te dice cuáles faltan y te explica cómo añadirlas.