Guía · 3 min de lectura

Cómo añadir cabeceras de seguridad en cualquier entorno

Cinco cabeceras cubren casi todo lo básico. Esto es lo que hace cada una y las líneas exactas para tu servidor.

Actualizado el · HackGrade

El código y la configuración se mantienen en inglés.

El conjunto inicial

  • Strict-Transport-Security: usar siempre HTTPS en este sitio (lee la guía de HSTS antes de activarla).
  • X-Content-Type-Options: nosniff: impide que los navegadores adivinen el tipo de archivo.
  • X-Frame-Options: SAMEORIGIN: impide que otros sitios enmarquen el tuyo (clickjacking).
  • Referrer-Policy: strict-origin-when-cross-origin: envía menos de tus URL a otros sitios.
  • Permissions-Policy: desactiva las funciones del navegador que no usas.

nginx

Añade esto dentro de tu bloque server { }, luego ejecuta nginx -t y recarga.

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

Ojo: si un bloque location tiene su propio add_header, nginx descarta las del nivel server para esa location. Repite ahí las cabeceras o ponlas en un archivo include compartido.

Apache (.htaccess)

Necesita mod_headers (activado en la mayoría de los hostings).

.htaccess
<IfModule mod_headers.c>
  Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
  Header always set X-Content-Type-Options "nosniff"
  Header always set X-Frame-Options "SAMEORIGIN"
  Header always set Referrer-Policy "strict-origin-when-cross-origin"
  Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>

Cloudflare

  1. Activa HSTS en SSL/TLS → Edge Certificates → HTTP Strict Transport Security.
  2. Para las demás cabeceras, crea una Response Header Transform Rule (Rules → Transform Rules → Modify Response Header) que establezca cada cabecera como valor estático para todas las peticiones entrantes.

WordPress sin acceso al servidor

Crea wp-content/mu-plugins/security-headers.php. Los plugins must-use se cargan automáticamente.

PHP
<?php
// Security headers for pages WordPress serves.
add_action( 'send_headers', function () {
    header( 'X-Content-Type-Options: nosniff' );
    header( 'X-Frame-Options: SAMEORIGIN' );
    header( 'Referrer-Policy: strict-origin-when-cross-origin' );
    header( 'Permissions-Policy: camera=(), microphone=(), geolocation=()' );
} );

Esto solo cubre las páginas generadas por PHP. Los archivos estáticos y algunas cachés de página se lo saltan, así que las cabeceras del servidor o de la CDN son mejores cuando puedes usarlas.

Siguiente paso: Content-Security-Policy

CSP es la cabecera más potente y la que más probabilidades tiene de romper algo. Sigue la guía de CSP y empieza en modo de solo informe.

Fuentes

Guías relacionadas

Gratis · Al instante · Sin registro

Conoce tu nota antes que nadie.

Análisis pasivo. Nada se ataca sin tu permiso.

Empieza gratis. Planes de pago desde 12 $ al mes, o un informe único por 29 $. Ver precios