Security headers: HSTS, CSP, X-Frame-Options e altri
· 7 min di lettura
In breve: Le security HTTP header sono righe che il server aggiunge a ogni risposta HTTP per dire al browser come trattare il tuo sito. Correttamente impostate eliminano intere classi di attacchi (XSS, clickjacking, MITM) - e sono gratis.
In breve: Le security HTTP header sono righe che il server aggiunge a ogni risposta HTTP per dire al browser come trattare il tuo sito. Correttamente impostate eliminano intere classi di attacchi (XSS, clickjacking, MITM) - e sono gratis.
Perché contano
Un'applicazione può essere perfettamente sicura backend-side, ma senza header corretti ancora vulnerabile ad attacchi browser-side: cross-site scripting (XSS), clickjacking, protocol downgrade, MIME confusion. Le security header spostano la difesa nel browser.
Strict-Transport-Security (HSTS)
Forza HTTPS per tutte le future visite. Dopo la prima visita HTTPS il browser ricorda il dominio e riscrive lui stesso qualsiasi link http:// in https://, anche se l'utente clicca su una risposta cattiva.
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
max-age=63072000= valido 2 anniincludeSubDomains= la regola vale anche per tutti i sottodomini (attenzione: se hai un sottodominio HTTP-only, lo rompe)preload= permette l'inclusione nella lista HSTS preload incorporata in Chrome / Firefox / Safari
Attenzione:
HSTS con preload impiega 6+ mesi per essere rimosso dalla lista. Non includere preload prima di aver verificato che HTTPS funzioni stabilmente anche per tutti i sottodomini.
Content-Security-Policy (CSP)
Header più potente ma anche più difficile da configurare. Whitelist da dove il browser può caricare script, stili, immagini, iframe. Senza CSP un attaccante che può iniettare tag <script> può eseguire qualsiasi JS - con CSP solo codice da fonti approvate.
Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-...'; img-src 'self' data: https://cdn.example.com; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'
Direttive comuni:
default-src 'self'= di default permetti solo risorse dal mio dominioscript-src= fonti JS (specifica hash o nonce per script inline)style-src= fonti CSSimg-src= immaginiconnect-src= AJAX, WebSocket, EventSourceframe-ancestors 'none'= nessuno può incorporare la pagina in iframe (meglio di X-Frame-Options)report-uri /csp-report= il browser invia JSON ad ogni violazione (tu catturi nel backend e logghi)
X-Frame-Options
Alternativa più vecchia a frame-ancestors. Previene il clickjacking - l'attaccante inserisce la tua pagina come iframe e la copre con pulsanti invisibili.
X-Frame-Options: DENY
Valori: DENY (nessuno), SAMEORIGIN (solo il mio dominio), ALLOW-FROM uri (deprecated).
X-Content-Type-Options
X-Content-Type-Options: nosniff
Disattiva il MIME sniffing - il browser rispetterà il Content-Type che il server ha restituito. Senza questo un attaccante può caricare un file con tipo sbagliato (es. un'immagine che è in realtà HTML con script) e il browser può eseguirlo come web page.
Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin
Controlla quante informazioni sulla pagina precedente il browser invia nell'header Referer al click. Il default nei browser moderni è già strict-origin-when-cross-origin, ma l'header dichiarativo esplicito assicura consistenza.
Permissions-Policy
Disattiva API che non ti servono - camera, microfono, GPS, geolocation. Un attaccante via XSS non può richiedere queste API.
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Configurazione pratica in nginx
server {
listen 443 ssl http2;
server_name example.com;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
# CSP è estesa - definisci secondo la tua applicazione
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; ..." always;
}
La chiave è always - senza di esso nginx omette gli header nelle risposte di errore (4xx, 5xx).
Audit dello stato attuale
Più facile via tool online. Il nostro header check ti mostrerà quali header mancano e quali sono sbagliati. Per audit approfondito anche securityheaders.com dà punteggio A-F.
Conclusione
Le security header sono uno dei migliori investimenti in rapporto sforzo-guadagno nell'area security - tipicamente mezz'ora di setup in reverse proxy contro un'intera categoria di attacchi browser-side. Audit una volta ogni sei mesi nell'ambito di manutenzione regolare è minimo ragionevole.
Audit gratuito di security headers
Senza registrazione, risultato in tre secondi.
Prova ePulz.io gratis - 7 giorni senza carta di credito.
Crea account