Por Qué Deberías Añadir Encabezados de Seguridad a tu Sitio
Los encabezados de seguridad desempeñan un papel crucial en la protección de tu sitio web. No solo aumentan la seguridad, sino que también le dicen a los navegadores modernos qué funciones del navegador están permitidas. Esto es esencial para mantener tu sitio a salvo de amenazas cibernéticas y garantizar una experiencia de usuario segura.
Tipos de Encabezados de Seguridad y sus Funciones
Existen varios tipos de encabezados de seguridad, y cada uno tiene un propósito específico. Aquí te explico algunos de los más importantes:
Content-Security-Policy (Política de Seguridad de Contenido)
Este encabezado te permite definir las fuentes aprobadas desde las cuales el navegador puede cargar contenido en tu sitio. Al especificar las fuentes que deseas permitir, puedes proteger a tus visitantes de una variedad de problemas, incluidos los intentos de Cross Site Scripting (XSS). Es crucial que estos encabezados se configuren correctamente, ya que controlan qué contenido se carga y qué se bloquea.
<IfModule mod_headers.c>
Header set Content-Security-Policy "upgrade-insecure-requests"
</IfModule>
Strict-Transport-Security (HSTS)
El encabezado Strict-Transport-Security indica a los navegadores que el sitio solo debe accederse a través de HTTPS en lugar de HTTP. Esto garantiza una conexión segura y cifrada, lo que es esencial para proteger la privacidad de los datos de tus visitantes.
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>
X-Xss-Protection (Protección contra Ataques XSS)
Este encabezado detiene la carga de páginas cuando se detectan ataques de Cross-Site Scripting (XSS). Asegura que tu sitio no sea vulnerable a este tipo de ataques, lo que es crucial para la seguridad en línea.
<IfModule mod_headers.c>
Header set X-Xss-Protection "1; mode=block"
</IfModule>
X-Frame-Options (Opciones de Marco)
X-Frame-Options protege a tus visitantes contra posibles ataques de «clickjacking» al especificar qué sitios tienen permitido embeber tu sitio en un marco. Su simplicidad lo convierte en una excelente opción para implementar sin complicaciones.
<IfModule mod_headers.c>
Header set X-Frame-Options "SAMEORIGIN"
</IfModule>
X-Content-Type-Options (Opciones de Tipo de Contenido)
Este encabezado tiene un único valor válido y evita que los navegadores intenten interpretar el tipo de contenido de una respuesta de manera diferente a la declarada por el servidor. Esto reduce la exposición a descargas no deseadas y riesgos asociados con la carga de contenido de usuarios.
<IfModule mod_headers.c>
Header set X-Content-Type-Options "nosniff"
</IfModule>
Referrer-Policy (Política de Referentes)
La Política de Referentes instruye al navegador sobre qué referente usar al hacer clic en enlaces a otros sitios. Puede ser útil para limitar la cantidad de información transmitida con cada clic.
<IfModule mod_headers.c>
Header set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>
Permissions-Policy (Política de Permisos)
Esta política permite desactivar o activar ciertas funciones de la plataforma web, tanto en tu sitio como en las páginas que incrustes. Ofrece un mayor control sobre cómo se ejecutan las características de la plataforma web.
<IfModule mod_headers.c>
Header set Permissions-Policy "geolocation=self"
</IfModule>
Cómo Comprobar tus Encabezados de Seguridad
Si ya has configurado encabezados de seguridad en tu sitio y deseas verificar si son válidos, puedes utilizar la herramienta externa de securityheaders.com para hacerlo.
Mi código personalizado
Aquí te dejo el código que yo utilizo en mis instalaciones de WordPress en el .htaccess:
Este seria el codigo básico:
# Inicio Security Headers
<IfModule mod_headers.c>
Header set Content-Security-Policy "upgrade-insecure-requests"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header set X-Xss-Protection "1; mode=block"
Header set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options "nosniff"
Header set Referrer-Policy "strict-origin-when-cross-origin"
Header set Permissions-Policy "geolocation=self"
</IfModule>
# Fin Security Headers
Y este es el código algo más completo
# Security HttpHeaders
<IfModule mod_headers.c>
Header set Content-Security-Policy "upgrade-insecure-requests"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
Header set X-Xss-Protection "1; mode=block"
Header set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options "nosniff"
Header set Referrer-Policy "strict-origin-when-cross-origin"
Header set Permissions-Policy "geolocation=self"
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET,POST"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
Header set Cross-Origin-Embedder-Policy "unsafe-none; report-to='default'"
Header set Cross-Origin-Embedder-Policy-Report-Only "unsafe-none; report-to='default'"
Header set Cross-Origin-Opener-Policy "unsafe-none"
Header set Cross-Origin-Opener-Policy-Report-Only "unsafe-none; report-to='default'"
Header set Cross-Origin-Resource-Policy "cross-origin"
Header set X-Permitted-Cross-Domain-Policies "none"
</IfModule>