Come funziona questo controllo
Scanaris richiede la tua pagina principale come farebbe un browser e legge gli header della risposta. Cerca sei header precisi e, per ciascuno mancante, apre un riscontro con un valore consigliato: Content-Security-Policy, Strict-Transport-Security e X-Frame-Options con severità media, e X-Content-Type-Options, Referrer-Policy e Permissions-Policy con severità bassa. Qui non valuta la qualità della CSP né dell'HSTS: lo fanno i controlli CSP debole e HSTS debole. Si guarda solo la risposta dell'URL analizzato, quindi se la tua API vive su un altro dominio, analizzalo a parte.
Cosa protegge ogni header
- Content-Security-Policy limita da dove possono essere caricati script, stili e immagini. È la difesa principale contro l'iniezione di script (XSS).
- Strict-Transport-Security obbliga il browser a usare sempre HTTPS con il tuo dominio, anche se qualcuno scrive l'indirizzo senza la s.
- X-Frame-Options impedisce che il tuo sito venga incorporato in un iframe altrui, che è la base del clickjacking.
- X-Content-Type-Options: nosniff evita che il browser "indovini" il tipo di un file ed esegua come script qualcosa che non lo era.
- Referrer-Policy controlla quanta parte dell'URL viene inviata ad altri siti quando un utente clicca un link.
- Permissions-Policy disattiva API del browser che non usi, come fotocamera, microfono o geolocalizzazione.
Come aggiungerli a seconda del tuo hosting
Vercel
In vercel.json, oppure in next.config con la funzione headers() se usi Next.js:
{
"headers": [
{
"source": "/(.*)",
"headers": [
{ "key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains; preload" },
{ "key": "X-Frame-Options", "value": "DENY" },
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" },
{ "key": "Permissions-Policy", "value": "camera=(), microphone=(), geolocation=()" }
]
}
]
}
Netlify
Un file _headers nella cartella che viene pubblicata:
/*
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Nuxt
In nuxt.config, dentro routeRules, la regola '/**' con un oggetto headers e le stesse coppie chiave-valore. È esattamente quello che fa Scanaris.
Express
import helmet from 'helmet';
app.use(helmet());
nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options "DENY" 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;
La Content-Security-Policy manca dagli esempi di proposito: dipende da quali script e servizi carica il tuo sito e conviene iniziarla in modalità report. La procedura è in header di sicurezza HTTP spiegati per umani.
Verifica che ci siano
curl -sI https://tuodominio.com | grep -iE "strict-transport|x-frame|x-content-type|referrer-policy|permissions-policy|content-security"
Devono comparire tutte e sei le righe. Se hai una CDN davanti al server, verifica sull'URL pubblico, perché alcune CDN tolgono o sovrascrivono gli header. L'analizzatore di header fa la stessa lettura con una spiegazione per header.
Domande frequenti
X-Frame-Options o frame-ancestors?
Fanno la stessa cosa; frame-ancestors dentro la CSP è la versione moderna e permette di elencare domini precisi. Mantieni anche X-Frame-Options per i browser vecchi; non si disturbano.
Posso rompere il sito aggiungendo questi header?
I cinque degli esempi non rompono nulla in un sito normale. L'unico a rischio è la CSP, per questo si aggiunge prima in modalità Content-Security-Policy-Report-Only e si passa a bloccare quando i report sono puliti.
Serve preload nell'HSTS?
Non per superare il controllo. preload permette di includere il tuo dominio nella lista che i browser portano di fabbrica; è un impegno a lungo termine (tutto il tuo dominio e i sottodomini in HTTPS per sempre), quindi attivalo solo quando sei sicuro.