Compruebe la seguridad de cualquier sitio web
Las cabeceras de seguridad HTTP son una parte fundamental de la seguridad de un sitio web. Permiten a los servidores web dar instrucciones a los navegadores sobre cómo deben comportarse al procesar el contenido de un sitio. Esto ayuda a prevenir ataques comunes como el Cross-Site Scripting (XSS), el clickjacking y los ataques de intermediario (man-in-the-middle). Al implementar correctamente cabeceras como Content-Security-Policy, Strict-Transport-Security y X-Frame-Options, añade una capa de defensa crucial a su aplicación. Esto no solo protege su sitio web, sino también los datos y la privacidad de sus usuarios.
La cabecera HTTP Strict Transport Security (HSTS) es una potente medida de seguridad que protege los sitios web contra ataques de intermediario, como los ataques de degradación de protocolo y el secuestro de cookies. En esencia, es una instrucción del servidor web al navegador para que se comunique exclusivamente a través de una conexión HTTPS segura y cifrada, y nunca a través del inseguro HTTP. El navegador recuerda esta instrucción durante un período especificado por el sitio web.
El principal peligro que HSTS aborda es el 'SSL stripping'. Imagine a un usuario conectándose a una red Wi-Fi pública en una cafetería. Un atacante en la misma red puede interceptar la primera solicitud HTTP no segura del usuario. Incluso si el sitio web normalmente redirige a HTTPS, el atacante puede bloquear esta redirección y mantener una conexión no cifrada con el usuario, mientras establece una conexión cifrada con el servidor. El usuario no nota nada, pero el atacante ahora puede leer todo el tráfico, incluidas las contraseñas y los datos personales, en texto plano. HSTS evita este escenario por completo. Una vez que un navegador ha recibido la cabecera HSTS de un dominio, convertirá automática e internamente todos los futuros intentos de conexión a través de HTTP a HTTPS, antes de que la solicitud salga de la red. El atacante simplemente nunca tiene la oportunidad de interceptar la conexión.
La implementación de HSTS se realiza a través de la propia cabecera, que puede contener varias directivas. La más importante es `max-age`, que especifica en segundos cuánto tiempo debe recordar el navegador la regla HSTS. Un valor típico recomendado es 31536000, que corresponde a un año. Otra directiva potente es `includeSubDomains`. Si está presente, la regla HSTS no solo se aplica al dominio principal (por ejemplo, `www.ejemplo.es`), sino también a todos los subdominios (como `blog.ejemplo.es` y `api.ejemplo.es`). Esta es una adición crucial, pero requiere que todos los subdominios sean totalmente accesibles a través de HTTPS. La máxima protección la proporciona la directiva `preload`. Si un sitio web cumple con requisitos estrictos, puede ser incluido en la 'lista de precarga HSTS', una lista que está codificada en los principales navegadores como Chrome, Firefox y Safari. Esto significa que incluso la primera conexión de un usuario al sitio web se fuerza inmediatamente a HTTPS, sin dejar ninguna ventana de vulnerabilidad.
La Content-Security-Policy (CSP) es uno de los mecanismos de defensa más potentes y esenciales contra una amplia gama de ataques de inyección de contenido, con el objetivo principal de mitigar el Cross-Site Scripting (XSS). En pocas palabras, la CSP permite a un administrador de sitio web definir una 'lista blanca' estricta de fuentes de confianza. Solo el contenido que se origine en estos dominios explícitamente aprobados puede ser cargado y ejecutado por el navegador. Esto incluye scripts, hojas de estilo, imágenes, fuentes, iframes y más. Todo lo que no esté en esta lista es bloqueado sin piedad por el navegador, reduciendo drásticamente la superficie de ataque para vulnerabilidades comunes.
Para entender el poder de la CSP, primero hay que entender la amenaza del XSS. Un ataque XSS ocurre cuando un atacante logra inyectar código malicioso, generalmente JavaScript, en un sitio web legítimo. Esto puede ocurrir a través de un campo de comentarios, una barra de búsqueda o una URL manipulada. Cuando otro usuario visita la página infectada, este script se ejecuta en su navegador con los mismos permisos que el propio sitio web. El atacante puede usar esto para robar cookies de sesión, capturar pulsaciones de teclas, modificar visualmente la página o redirigir al usuario a un sitio de phishing. La CSP ataca este problema de raíz. Incluso si un atacante inyecta un script malicioso, una CSP bien configurada instruirá al navegador para que no lo ejecute porque no proviene de una fuente aprobada. Por defecto, la CSP también bloquea los scripts en línea y las funciones de tipo `eval()`, que son técnicas comunes en los ataques XSS.
La configuración de una CSP se realiza a través de una serie de 'directivas' en el valor de la cabecera. Cada directiva gestiona un tipo específico de contenido. Por ejemplo, `script-src` determina qué fuentes pueden suministrar scripts, `style-src` controla las hojas de estilo y `img-src` gestiona las imágenes. La directiva `default-src` actúa como un respaldo para la mayoría de las otras directivas. Los valores de fuente comunes son `'self'` (que se refiere al propio dominio), dominios específicos (como `https://apis.google.com`) y `'none'` (que no permite nada). La implementación de una CSP requiere una planificación cuidadosa, ya que una política demasiado estricta puede romper la funcionalidad legítima. Por lo tanto, la CSP también ofrece un modo `report-only`. En este modo, las violaciones no se bloquean, sino que se envía un informe a una URL especificada por el desarrollador a través de la directiva `report-uri` o `report-to`. Esto permite a los equipos probar y afinar su política en un entorno de producción sin interrumpir la experiencia del usuario.
La cabecera `X-Content-Type-Options` es una medida de seguridad aparentemente simple, pero extremadamente efectiva, que bloquea un vector de ataque específico e insidioso: el 'MIME type sniffing'. Con un único valor posible y válido, `nosniff`, esta cabecera da una instrucción clara e inequívoca al navegador: confía en la cabecera `Content-Type` enviada por el servidor y bajo ninguna circunstancia intentes adivinar por ti mismo qué tipo de archivo estás recibiendo. Esta simple regla es una defensa fundamental contra una clase de ataques que explotan la tendencia de los navegadores a ser 'serviciales'.
El núcleo del problema es el 'MIME sniffing'. Los servidores web envían una cabecera `Content-Type` con cada archivo para decirle al navegador qué es (por ejemplo, `text/html`, `image/jpeg`, `application/javascript`). Sin embargo, los navegadores más antiguos a veces intentaban ser más listos que el servidor. Por ejemplo, si un servidor enviaba un archivo con `Content-Type: text/plain`, pero el contenido parecía HTML, el navegador podría decidir renderizarlo como HTML de todos modos. Aunque esto tenía la intención de corregir servidores mal configurados, creó una peligrosa vulnerabilidad. Un atacante puede explotar esto subiendo un archivo que parece inofensivo a primera vista pero que en realidad contiene código malicioso.
Un escenario de ataque clásico es el siguiente: un atacante sube un archivo a un sitio web, por ejemplo, como foto de perfil. Este archivo tiene una extensión `.jpg` y contiene datos de imagen válidos, pero también hay código JavaScript malicioso oculto en su interior. El servidor ve la extensión `.jpg`, confía en ella y sirve el archivo con `Content-Type: image/jpeg`. Cuando una víctima ve esta 'imagen', un navegador sin la instrucción `nosniff` podría inspeccionar el archivo. El navegador detecta el código JavaScript y decide, a pesar de la cabecera `Content-Type`, que es un script y lo ejecuta. Dado que este script se ejecuta en el contexto del sitio web, tiene acceso a la sesión del usuario, lo que puede llevar a una toma de control completa de la cuenta a través de Cross-Site Scripting (XSS).
La cabecera `X-Content-Type-Options: nosniff` detiene este ataque por completo. El navegador recibe ahora la orden explícita: 'Si el servidor dice que esto es un `image/jpeg`, trátalo como una imagen y nada más'. El navegador ya no intentará 'olfatear' el contenido e ignorará el código JavaScript oculto. La implementación es trivial: es simplemente añadir una única cabecera a todas las respuestas del servidor. Es un ejemplo perfecto de un principio de 'defensa en profundidad': incluso si otras capas de seguridad (como la validación de archivos al subirlos) fallan, esta cabecera proporciona una robusta línea de defensa final. Es una medida esencial y de bajo esfuerzo que debería estar presente en todo sitio web moderno.
La cabecera `X-Frame-Options` es una medida de seguridad crucial diseñada específicamente para prevenir un ataque insidioso llamado 'clickjacking'. El clickjacking, también conocido como 'ataque de reparación de interfaz de usuario', es una técnica en la que un atacante engaña a un usuario para que haga clic en algo diferente de lo que percibe. Esto se logra generalmente superponiendo una página web invisible o transparente (o parte de ella) en un iframe sobre la página visible. El usuario cree que está haciendo clic en un botón inofensivo, como 'Ganar un premio', pero en realidad, su clic se registra en la página invisible de debajo, por ejemplo, en un botón de 'Eliminar mi cuenta' de un sitio web en el que está conectado en ese momento.
La cabecera `X-Frame-Options` proporciona una forma simple pero efectiva de controlar si un navegador puede renderizar una página dentro de elementos de incrustación como marcos o iframes. Al incluir esta cabecera en la respuesta HTTP de una página web, el servidor puede instruir al navegador sobre cómo manejar dichas solicitudes. Hay dos directivas de uso común y una obsoleta. La opción más restrictiva y segura es `DENY`. Este valor prohíbe completamente la renderización de la página en un marco, independientemente del sitio web que lo intente. Esta es la mejor opción para páginas con acciones muy sensibles que nunca deberían ser incrustadas, como las páginas de cambio de contraseña o las páginas de transacciones financieras.
Una opción más flexible y muy común es `SAMEORIGIN`. Esta directiva permite que la página se renderice en un marco, pero solo si el sitio web que intenta incrustar la página tiene el mismo origen (dominio) que la propia página. Esto es particularmente útil para aplicaciones web que utilizan iframes para su propia funcionalidad legítima, como mostrar ventanas modales o integrar diferentes partes de la misma aplicación, mientras se evita la incrustación por parte de sitios web externos y potencialmente maliciosos. una tercera opción obsoleta es `ALLOW-FROM uri`, que permitía especificar una URL concreta que podía enmarcar la página. Sin embargo, esta opción nunca fue ampliamente soportada por todos los navegadores y ahora se considera obsoleta.
Aunque `X-Frame-Options` sigue siendo muy relevante y eficaz, es importante señalar que la más moderna `Content-Security-Policy` (CSP) incluye una directiva `frame-ancestors`. Esta directiva se considera la sucesora de `X-Frame-Options` ya que ofrece más flexibilidad (como la especificación de múltiples dominios permitidos). Sin embargo, debido a su amplio soporte y simplicidad, la implementación de `X-Frame-Options` sigue siendo una estrategia de 'defensa en profundidad' recomendada, especialmente para garantizar la compatibilidad con navegadores más antiguos. Al configurar correctamente esta cabecera, se neutraliza eficazmente toda una clase de ataques basados en la interfaz de usuario.
La cabecera `Referrer-Policy` es un instrumento esencial para proteger la privacidad de los usuarios al controlar qué información se envía en la cabecera `Referer` (nótese el error ortográfico histórico) cuando un usuario navega de una página a otra. Por defecto, un navegador envía la URL completa de la página anterior a la nueva página. Si bien esto es útil para la analítica y para entender los flujos de tráfico, crea un riesgo de privacidad significativo. Las URL pueden contener información sensible, como términos de búsqueda, identificadores de usuario o incluso tokens de restablecimiento de contraseña. El envío de estos datos a terceros sin el conocimiento del usuario es una fuga de datos que puede ser explotada.
La `Referrer-Policy` permite a los propietarios de sitios web controlar con precisión este comportamiento utilizando diversas directivas. La elección de una directiva es un equilibrio entre la privacidad y la funcionalidad. Una de las opciones más estrictas es `no-referrer`. Como su nombre indica, la cabecera `Referer` se omite por completo en todas las solicitudes salientes en este caso. Esto proporciona la máxima privacidad, pero imposibilita que el sitio receptor vea de dónde proviene el tráfico, lo que puede complicar el análisis de las fuentes de tráfico. Otra opción común y respetuosa con la privacidad es `strict-origin-when-cross-origin`. A menudo es una buena opción por defecto. Se comporta de la siguiente manera: para la navegación dentro del mismo sitio web (por ejemplo, de `ejemplo.es/pagina1` a `ejemplo.es/pagina2`), se envía la URL completa. Sin embargo, para la navegación a otro sitio web (cross-origin), solo se envía la URL base (el origen, por ejemplo, `https://ejemplo.es/`), y solo si la conexión es igualmente segura (HTTPS a HTTPS).
Otras directivas ofrecen un control más granular. `same-origin` asegura que el referente solo se envíe para solicitudes dentro del mismo sitio web; se omite para todas las demás solicitudes. `strict-origin` envía solo la URL base, pero a diferencia de `strict-origin-when-cross-origin`, también lo hace para la navegación dentro del mismo sitio. En el otro extremo del espectro se encuentra `unsafe-url`, que, como su nombre indica, no es seguro. Esta directiva siempre envía la URL completa, incluidos los parámetros de consulta, incluso en solicitudes no seguras (HTTP). Su uso está fuertemente desaconsejado. Al elegir conscientemente una `Referrer-Policy`, los propietarios de sitios web asumen la responsabilidad de los datos de sus usuarios. La implementación de una política restrictiva, como `strict-origin-when-cross-origin`, es un paso simple que mejora significativamente la privacidad sin romper la funcionalidad esencial.
La cabecera `Permissions-Policy` es una característica de seguridad moderna y potente que otorga a los administradores de sitios web un control detallado sobre qué características y API del navegador se pueden utilizar en una página. Esta cabecera, que reemplaza a la antigua `Feature-Policy`, se basa en el 'principio de privilegio mínimo': un fragmento de código solo debe tener los permisos absolutamente necesarios para realizar su tarea. Al definir explícitamente qué características están permitidas, los desarrolladores pueden reducir significativamente la 'superficie de ataque' de su sitio web y proteger mejor la privacidad del usuario.
Las aplicaciones web modernas utilizan cada vez más potentes API del navegador, como el acceso a la cámara (`camera`), el micrófono (`microphone`), la geolocalización (`geolocation`), el modo de pantalla completa (`fullscreen`) y el procesamiento de pagos (`payment`). Si bien estas características permiten experiencias de usuario innovadoras, también plantean un riesgo potencial. Una vulnerabilidad en un script de terceros, como un script de publicidad o de análisis cargado en su página, podría ser explotada para obtener acceso no deseado a estas API sensibles. Por ejemplo, a un usuario se le podría solicitar sin saberlo que conceda acceso al micrófono a un script no confiable que se aprovecha de su sitio web legítimo.
La `Permissions-Policy` aborda este problema especificando una política clara. La cabecera consta de una serie de directivas, donde cada directiva representa una característica específica. Para cada característica, se puede especificar una lista de 'orígenes' (dominios) permitidos. Por ejemplo, si un sitio web no necesita acceso al micrófono, el desarrollador puede deshabilitarlo explícitamente con `permissions-policy: microphone=()`. Los paréntesis vacíos `()` significan que la característica está deshabilitada para todas las partes (incluido el propio sitio y todos los iframes). Si una característica solo debe ser utilizada por el propio sitio web, se puede configurar con `microphone=('self')`. Esto asegura que los iframes incrustados de terceros, como un video de YouTube, no puedan solicitar acceso al micrófono.
El verdadero poder de `Permissions-Policy` reside en su control granular sobre el contenido de terceros. Puede otorgar permiso a un dominio específico, por ejemplo, `permissions-policy: camera=('self' https://trusted-partner.com)`. Esto asegura que solo su propio sitio y un socio de confianza puedan usar la cámara. Todos los demás iframes serán bloqueados. La implementación de una `Permissions-Policy` estricta es una de las mejores prácticas para el desarrollo web moderno. Obliga a los desarrolladores a pensar conscientemente en qué funcionalidad necesita realmente su aplicación y proporciona una capa de defensa robusta contra el abuso de las API del navegador. Esto se traduce en una experiencia más segura para el usuario y fortalece la confianza en su plataforma.
La cabecera `X-XSS-Protection` es una pieza de la historia de Internet; una medida de seguridad introducida en su día en navegadores como Internet Explorer, Chrome y Safari como primera línea de defensa contra los ataques de Cross-Site Scripting (XSS) 'reflejados'. Aunque la intención era buena, la cabecera está ahora obsoleta y es desaprobada e incluso ignorada por todos los navegadores modernos. Su funcionalidad ha sido completamente reemplazada por la `Content-Security-Policy` (CSP), mucho más robusta y configurable. Sin embargo, comprender el funcionamiento y las deficiencias de `X-XSS-Protection` proporciona una valiosa visión de la evolución de la seguridad web.
La cabecera fue diseñada para bloquear un vector de ataque específico: un ataque XSS 'reflejado'. Este tipo de ataque ocurre cuando el código malicioso, a través de un parámetro de URL o una entrada de formulario, es 'reflejado' por el servidor e incluido directamente en la respuesta HTML. La cabecera `X-XSS-Protection` activaba un 'auditor' o 'filtro' incorporado en el navegador. Este filtro utilizaba heurísticas para detectar si el código de script en la solicitud (por ejemplo, en la URL) también aparecía literalmente en el HTML de la página. Si era así, el navegador concluía que se estaba produciendo un ataque.
La cabecera podía tener varios valores. El valor por defecto era `1`, que activaba el filtro. Al detectar un ataque, el navegador intentaba 'sanear' la página eliminando o neutralizando el código malicioso. Sin embargo, este enfoque resultó ser peligroso. Los atacantes descubrieron formas de eludir estos mecanismos de saneamiento y, en algunos casos, incluso pudieron crear vulnerabilidades que no existían sin el filtro. Una opción más segura era `1; mode=block`. En este modo, al detectar un ataque, el navegador dejaría de renderizar la página por completo y mostraría una página en blanco. Esto evitaba la ejecución del script pero proporcionaba una mala experiencia de usuario. El valor `0` desactivaba explícitamente el filtro.
Finalmente, la cabecera fue desaprobada por varias razones. Los filtros no eran fiables, podían ser eludidos y a veces causaban 'falsos positivos' que rompían sitios web legítimos. Más importante aún, el auge de la `Content-Security-Policy` ofreció un enfoque fundamentalmente superior. En lugar de intentar 'adivinar' los ataques basándose en heurísticas poco fiables, la CSP permite a los desarrolladores definir una 'lista blanca' estricta de fuentes de código de confianza. Este modelo de 'denegación por defecto' es inherentemente más seguro. Aunque todavía puede encontrar la cabecera `X-XSS-Protection` en sitios web más antiguos, ya no se considera una medida de seguridad activa para el desarrollo web moderno. El enfoque ahora está completamente en una CSP fuerte y bien configurada.
Esta herramienta analiza la URL que introduce y comprueba la presencia y la configuración correcta de las cabeceras de seguridad más importantes. Proporcionamos un resumen claro de qué cabeceras están presentes y cuáles faltan. Además, ofrecemos una explicación detallada del propósito de cada cabecera y los riesgos que corre si no está presente. Utilice este análisis para mejorar la seguridad de su sitio web.