HeadersCSPHSTS5 min de lectura

Configurar headers de seguridad HTTP

Content-Security-Policy, X-Frame-Options, HSTS, Referrer-Policy y configuración para Nginx y Apache.


¿Por qué importan los headers de seguridad?

Los headers HTTP de seguridad protegen a tus usuarios contra ataques como XSS, clickjacking, sniffing de contenido y más. Se configuran en el servidor web y el navegador los aplica automáticamente.

Headers esenciales

Content-Security-Policy (CSP)

Controla qué recursos puede cargar tu página:

nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.ejemplo.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com;" always;

Empezá con una política permisiva y ajustá según los errores en la consola del navegador.

X-Frame-Options

Previene clickjacking (tu sitio embebido en un iframe malicioso):

nginx
add_header X-Frame-Options "SAMEORIGIN" always;

Opciones: DENY, SAMEORIGIN, ALLOW-FROM uri

X-Content-Type-Options

Evita que el navegador adivine el tipo MIME:

nginx
add_header X-Content-Type-Options "nosniff" always;

Referrer-Policy

Controla qué información de referencia se envía:

nginx
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

Permissions-Policy

Controla qué APIs del navegador puede usar tu sitio:

nginx
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;

Strict-Transport-Security (HSTS)

Fuerza HTTPS en todas las conexiones futuras:

nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

Configuración completa para Nginx

nginx
server {
    listen 443 ssl http2;
    server_name tudominio.com;

    # Headers de seguridad
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline';" always;
}

Configuración para Apache

En .htaccess o en la configuración del virtualhost:

apache
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"

Asegurate de tener el módulo headers habilitado:

bash
sudo a2enmod headers
sudo systemctl restart apache2

Verificar headers

bash
curl -I https://tudominio.com

O usá securityheaders.com para un análisis completo con calificación.

Recomendaciones

  • Empezá con headers básicos y agregá CSP gradualmente
  • Usá el modo "report-only" de CSP para testear sin romper nada
  • Verificá tu configuración en securityheaders.com (apuntá a A+)
  • No uses unsafe-eval en CSP a menos que sea estrictamente necesario
  • Activá HSTS solo después de confirmar que HTTPS funciona correctamente

¿Te resultó útil esta guía?