🛡️ Headers de Seguridad HTTP — Hardening Web & Estándar OWASP

Defensa en Profundidad a Nivel de Protocolo HTTP/HTTPS

Los Headers de Seguridad HTTP (cabeceras de respuesta HTTP) son directivas criptográficas y de política enviadas por el servidor web o CDN (Cloudflare, Vercel, Caddy, Nginx) al navegador del cliente. Su propósito es restringir qué recursos pueden ejecutarse, exigir cifrado de transporte estricto, aislar procesos en memoria y bloquear vectores de ataque críticos como Cross-Site Scripting (XSS), Clickjacking, MIME-Sniffing, SSL Stripping (MitM) y fugas de canal lateral (Spectre / XS-Leaks).


🧭 Mapa de Amenazas vs. Cabeceras Defensivas

flowchart LR
    Attack(["👾 Vectores de Ataque Web"]) --> XSS["💉 Inyección XSS &\nScripts Maliciosos"]
    Attack --> Click["🖼️ Clickjacking &\nIframes Ocultos"]
    Attack --> MitM["🔓 SSL Stripping &\nDowngrade HTTP"]
    Attack --> MIME["🎭 MIME-Type Sniffing &\nEjecución de Archivos"]
    Attack --> Side["🕵️ XS-Leaks, Spectre &\nFuga de Sensores"]

    XSS -->|"Mitigado por"| CSP["🛡️ Content-Security-Policy (CSP)"]
    Click -->|"Mitigado por"| Frame["🧱 CSP frame-ancestors + X-Frame-Options"]
    MitM -->|"Mitigado por"| HSTS["🔒 Strict-Transport-Security (HSTS)"]
    MIME -->|"Mitigado por"| NoSniff["📄 X-Content-Type-Options: nosniff"]
    Side -->|"Mitigado por"| Iso["🌐 COOP + COEP + Permissions-Policy"]

📊 Matriz de Cabeceras Esenciales (Estándar OWASP)

Cabecera HTTPValor Recomendado en ProducciónAtaque que BloqueaImpacto y Función Técnica
Content-Security-Policydefault-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; upgrade-insecure-requests;XSS, Inyección de datos, ClickjackingDefine la lista blanca estricta de orígenes permitidos para scripts, estilos, fuentes, imágenes, conexiones fetch/WebSocket y marcos embebidos.
Strict-Transport-Securitymax-age=63072000; includeSubDomains; preloadMan-in-the-Middle (MitM), SSL StrippingObliga al navegador a conectarse exclusivamente por HTTPS durante 2 años (63072000 s), incluyendo subdominios y lista HSTS Preload integrada en los navegadores.
X-Content-Type-OptionsnosniffMIME Confusion / Drive-by DownloadImpide que el navegador “adivine” el tipo de contenido de un archivo e intente ejecutar una imagen o texto subido por un usuario como si fuera JavaScript o HTML.
Referrer-Policystrict-origin-when-cross-originFuga de URLs y tokens en cabeceras RefererEnvía la ruta completa en peticiones del mismo origen, pero solo envía el dominio raíz (origin) al navegar a terceros por HTTPS, y nada si baja a HTTP.
Permissions-Policycamera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=()Abuso de APIs de hardware y trackingDesactiva explícitamente el acceso del DOM y de iframes anidados a sensores sensibles (cámara, micrófono, GPS, WebUSB) que la aplicación no necesita.
Cross-Origin-Opener-Policysame-originXS-Leaks / Ataques de ventana cruzadaAísla el grupo de contexto de navegación para que ventanas emergentes externas (window.open) no puedan obtener referencias a window.opener.
Cross-Origin-Embedder-Policyrequire-corp (o credentialless)Spectre / Side-Channel Memory LeaksExige que todo recurso cruzado autorice su carga mediante CORS/CORP. Junto con COOP, habilita el aislamiento necesario para usar SharedArrayBuffer (WASM).
Cross-Origin-Resource-Policysame-origin (o same-site)Robo de recursos estáticos / HotlinkingIndica al navegador que bloquee la lectura de imágenes, scripts o JSON desde sitios externos no autorizados.
X-Frame-OptionsDENY (o SAMEORIGIN)Clickjacking (Fallback legacy)Impide que la página sea incrustada dentro de un <frame> o <iframe> malicioso. Aunque frame-ancestors de CSP lo reemplaza, se mantiene por compatibilidad total.

⚠️ Cabeceras Deprecadas o Peligrosas (Qué NO Usar)

Advertencia Crítica de OWASP: Cabeceras Obsoletas

  1. X-XSS-Protection: Desaconsejada oficialmente. Los filtros XSS antiguos integrados en navegadores fueron retirados porque podían ser explotados para provocar vulnerabilidades de fuga de información entre orígenes. La recomendación actual de OWASP es omitirla o forzar su apagado explícito: X-XSS-Protection: 0
  2. Public-Key-Pins (HPKP): Completamente eliminada del estándar web. Un error en la rotación de llaves criptográficas podía dejar el dominio inaccesible de forma permanente (brick) para los visitantes. En su lugar se utiliza Expect-CT (hoy automatizado por Certificate Transparency) y registros DNS CAA.
  3. Server y X-Powered-By: No son cabeceras de seguridad, sino de exposición de huella digital (Fingerprinting). Siempre oculta versiones exactas como X-Powered-By: Express o Server: nginx/1.24.0.

💻 Implementación Lista para Producción por Stack

1. Cloudflare Pages / Netlify (Archivo public/_headers)

Ideal para sitios estáticos y SSR construidos con Astro como Dev Env Pro y La Leña Pollería:

/*
  Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
  X-Content-Type-Options: nosniff
  X-Frame-Options: DENY
  X-XSS-Protection: 0
  Referrer-Policy: strict-origin-when-cross-origin
  Permissions-Policy: accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()
  Cross-Origin-Opener-Policy: same-origin
  Cross-Origin-Resource-Policy: same-origin
  Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https:; connect-src 'self' https:; frame-ancestors 'none'; base-uri 'self'; form-action 'self'; upgrade-insecure-requests;

2. Servidor Web Caddy (Caddyfile)

Utilizado en despliegues de alto rendimiento como Antigravity CLI Docs:

tu-dominio.com {
    encode zstd gzip
 
    header {
        Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "DENY"
        Referrer-Policy "strict-origin-when-cross-origin"
        Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()"
        Cross-Origin-Opener-Policy "same-origin"
        Content-Security-Policy "default-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; script-src 'self'; frame-ancestors 'none'; upgrade-insecure-requests;"
        # Eliminar huella del servidor
        -Server
        -X-Powered-By
    }
 
    root * /srv/dist
    file_server
}

3. Next.js 15 (next.config.ts)

Para aplicaciones fullstack como SimplySpend o Portfolio v2:

import type { NextConfig } from 'next';
 
const securityHeaders = [
  { key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubDomains; preload' },
  { key: 'X-Content-Type-Options', value: 'nosniff' },
  { key: 'X-Frame-Options', value: 'DENY' },
  { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
  { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
  { key: 'Cross-Origin-Opener-Policy', value: 'same-origin' },
];
 
const nextConfig: NextConfig = {
  poweredByHeader: false, // Oculta X-Powered-By: Next.js
  async headers() {
    return [
      {
        source: '/(.*)',
        headers: securityHeaders,
      },
    ];
  },
};
 
export default nextConfig;

4. Node.js & Express 5 (helmet)

Para APIs backend como PuntoNet Service Desk o Tienda de Ropa Perú:

import express from 'express';
import helmet from 'helmet';
 
const app = express();
 
// Configura automáticamente CSP, HSTS, nosniff, frameguard, COOP, CORP y oculta X-Powered-By
app.use(
  helmet({
    contentSecurityPolicy: {
      directives: {
        defaultSrc: ["'self'"],
        scriptSrc: ["'self'"],
        frameAncestors: ["'none'"],
        upgradeInsecureRequests: [],
      },
    },
    hsts: {
      maxAge: 63072000,
      includeSubDomains: true,
      preload: true,
    },
  })
);

🔍 Auditoría Rápida desde Terminal

Verificación de Cabeceras HTTP con curl

# Inspeccionar únicamente las cabeceras HTTP de respuesta siguiendo redirecciones
curl -s -I -L https://mise-curso.pages.dev | grep -iE "^(strict-transport|content-security|x-frame|x-content-type|referrer-policy|permissions-policy|cross-origin|server)"

Plataformas Oficiales de Escaneo Online

  • SecurityHeaders.com (por Scott Helme): Evalúa instantáneamente del grado F al A+.
  • MDN HTTP Observatory (Mozilla): Analiza CSP, cookies (Secure, HttpOnly, SameSite=Strict), CORS y HSTS.
  • CSP Evaluator (Google): Valida si tu directiva Content-Security-Policy tiene puntos débiles o comodines inseguros.

🔗 Conexiones en la Bóveda