Defaults.Exposed

Defaults.ExposedCorrezioni › Protezione dal MIME-sniffing (X-Content-Type-Options)

Come correggere Protezione dal MIME-sniffing (X-Content-Type-Options)

Un header di una sola riga che impedisce ai browser di indovinare cosa sia davvero un file. Senza di esso, un file che qualcuno carica sul tuo sito, o un file presente sulle tue pagine, può essere interpretato male dal browser ed eseguito come codice: è proprio così che alcuni attacchi trasformano un caricamento dall'aria innocua in un modo per rubare le sessioni dei tuoi clienti.

In sintesi per la tua attività: L'assenza di questo header è un segnale chiaro e facilmente rilevabile che le basi non sono in atto. Da solo raramente mette fuori uso un sito, ma combinato con un modulo di caricamento file o con contenuti generati dagli utenti apre una via a un aggressore per eseguire codice dannoso nei browser dei tuoi visitatori, dirottando sessioni autenticate, rubando dati di carte o credenziali di accesso e mettendoti dalla parte sbagliata di una vicenda di violazione dati. È una delle correzioni più economiche in fatto di sicurezza: una riga, gratis, circa cinque minuti.

Cosa può costarti

Perché è importante. I browser, quando un server è vago su cosa sia un file, cercano di indovinare («sniffing») il tipo di contenuto. Gli aggressori sfruttano questa supposizione: caricano un file che il server etichetta come immagine, ma ne confezionano il contenuto in modo che il browser decida che in realtà è JavaScript, e lo esegua. L'header X-Content-Type-Options: nosniff dice a ogni browser di smettere di indovinare e di fidarsi del tipo dichiarato dal server, chiudendo l'intera categoria di trucchi. È un controllo a punteggio che vale 25 punti ed è classificato come gravità media quando manca.

La versione breve per il titolare

C’è un presupposto silenzioso integrato in ogni browser web: quando scarica un file dal tuo sito, cerca di capire di che tipo di file si tratta. Di solito si fida del tuo server. Ma se il tuo server è vago, il browser indovina, e quell’indovinare si chiama MIME-sniffing.

Il problema è che gli aggressori possono manipolare quella supposizione. Possono confezionare un file che il tuo server crede onestamente sia un’immagine innocua, ma che il browser, lasciato a indovinare, decide essere in realtà un pezzo di codice di programma, e lo esegue, proprio dentro il browser del tuo cliente, sul tuo dominio.

Esiste un’istruzione di una sola riga che spegne l’indovinare: X-Content-Type-Options: nosniff. Dice a ogni browser: «non indovinare, fidati esattamente di ciò che ti dice il mio server». È tutta la correzione. È gratuita, richiede circa cinque minuti e, su un sito ben costruito, non rompe nulla.

Questo controllo cerca quell’header. Se manca, perdi 25 punti ed è classificato come problema di gravità media, non perché l’header da solo sia una catastrofe, ma perché la sua assenza è un segnale affidabile che le basi non sono state messe in sicurezza.

Quanto può costarti

Sono scenari realistici a livello aziendale, non teatro del caso peggiore.

Nessuno di questi scenari richiede un aggressore sofisticato. L’abuso del MIME-sniffing è ben compreso e automatizzato, ed è proprio per questo che gli scanner segnalano l’header mancante con tanta fermezza.

Cos’è davvero

Quando un browser riceve un file, il server dovrebbe etichettarlo con un tipo di contenuto (per esempio image/png per un’immagine PNG o text/html per una pagina web). Storicamente i browser non si fidavano del tutto di quell’etichetta, in parte perché alcuni server sbagliavano, quindi davano un’occhiata ai byte reali del file e decidevano da soli. Quell’occhiata è il MIME-sniffing.

Era una comodità diventata un rischio. Se un aggressore riesce a far arrivare un file sul tuo sito (tramite un modulo di caricamento, un campo commenti, un documento importato) e a influenzarne il contenuto, può confezionare qualcosa che il server etichetta in modo innocuo ma che il browser annusa come script eseguibile. Il browser lo esegue allora sul tuo dominio, con tutta la fiducia che il tuo dominio porta con sé.

X-Content-Type-Options: nosniff elimina del tutto l’indovinare. Con questo impostato, al browser viene detto: usa il tipo dichiarato dal server e nient’altro. Un file etichettato come immagine viene trattato come immagine, punto, anche se il suo contenuto sembra script. Il vettore d’attacco si chiude.

Come si presenta una configurazione corretta: ogni risposta del tuo sito, pagine e risorse allo stesso modo, porta esattamente questo header:

X-Content-Type-Options: nosniff

Non esiste altro valore valido né nulla da regolare. Se la tua CDN e il tuo server lo aggiungono entrambi (così vedi nosniff, nosniff), va bene e conta comunque come superato.

Come correggerlo (gratis, circa 5 minuti)

Passa questa sezione a chi gestisce il tuo sito: il tuo referente IT, lo sviluppatore web o l’assistenza dell’hosting. La correzione è gratuita e rapida; non c’è nulla da acquistare. Quello che chiedi è semplice: «Aggiungi l’header di risposta X-Content-Type-Options: nosniff a ogni pagina e risorsa del sito.»

Ecco il dettaglio per loro, per piattaforma comune.

Cloudflare (o una CDN/proxy simile) — spesso il punto più rapido, copre tutto il sito in un colpo solo:

Nginx — aggiungi dentro il blocco server (o location) pertinente:

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

La parola chiave always garantisce che venga inviato anche sulle risposte di errore. Ricarica Nginx dopo il salvataggio.

Apache — richiede mod_headers abilitato; nella configurazione del sito o in .htaccess:

Header always set X-Content-Type-Options "nosniff"

IIS / hosting Windows — in web.config sotto <system.webServer>:

<httpProtocol>
  <customHeaders>
    <add name="X-Content-Type-Options" value="nosniff" />
  </customHeaders>
</httpProtocol>

Node / Express — impostalo per ogni risposta:

app.use((req, res, next) => {
  res.setHeader('X-Content-Type-Options', 'nosniff');
  next();
});

(Oppure usa il pacchetto helmet, che imposta questo e diversi altri header di sicurezza per impostazione predefinita.)

Siti su Google Workspace / Microsoft 365: questi gestiscono la tua email e i tuoi documenti, non l’hosting del tuo sito pubblico, quindi l’header non si imposta lì: si imposta dove viene servito il tuo sito (la tua CDN, il server web o il costruttore di siti). Se usi un costruttore di siti in hosting (Squarespace, Wix, Shopify e simili), molti aggiungono questo header automaticamente; verifica il risultato invece di darlo per scontato, e chiedi alla loro assistenza se manca.

Dopo la pubblicazione, verificalo. Riesegui la tua scansione, oppure fai controllare al tuo sviluppatore gli header di risposta negli strumenti di sviluppo del browser (scheda Network → clic su una richiesta qualsiasi → Response Headers) e conferma che X-Content-Type-Options: nosniff sia presente. Prova brevemente il sito per confermare che nulla di formattato o con script si sia rotto: su un sito ben costruito, nulla si romperà.

Errori comuni

Passa questo al tuo referente IT

Il riassunto tecnico: questo controllo ispeziona gli header di risposta HTTP e supera quando X-Content-Type-Options è presente e il suo valore (senza distinzione tra maiuscole e minuscole) contiene nosniff, incluso il caso multi-origine nosniff, nosniff in cui CDN e origine lo impostano entrambi. Mancante o con qualsiasi valore diverso da nosniff fallisce. È un controllo a punteggio P2 che vale 25 punti, classificato gravità media quando fallisce, e mappa su OWASP Top 10 A05 (Security Misconfiguration). Il rimedio è un singolo header di risposta statico applicato a tutte le risposte; non ci sono parametri né valori alternativi validi. Impostalo al perimetro (CDN) per la copertura di tutto il sito, oppure sul server web con la semantica always così da emetterlo anche sulle risposte di errore, poi conferma negli header di risposta.

FAQ

Non permettiamo a nessuno di caricare file. Ci serve comunque?

Sì, e vale comunque la pena farlo. L'header è difesa in profondità: impedisce anche che il browser interpreti male script, fogli di stile e file di dati serviti dal tuo stesso sito, il che protegge da diversi trucchi di cross-site scripting persino su siti senza modulo di caricamento. Non costa nulla e non rompe mai un sito configurato correttamente, quindi non c'è motivo di saltarlo.

Aggiungerlo romperà qualcosa sul nostro sito?

Quasi mai. nosniff si limita a far rispettare ai browser il tipo di contenuto che il tuo server già invia. L'unico modo in cui causa problemi è se il tuo server etichetta male i file, per esempio inviando un foglio di stile o uno script con il tipo sbagliato. Se qualcosa si rompe, è un bug reale che nosniff ha messo in luce, non causato, e vale comunque la pena correggerlo. Fai una prova dopo la pubblicazione.

Come si presenta concretamente una configurazione corretta?

Un singolo header di risposta su ogni pagina e risorsa: X-Content-Type-Options: nosniff. È l'intera configurazione corretta: non esistono altri valori validi né nulla da regolare.

La nostra CDN (Cloudflare o simile) e il nostro server lo aggiungono entrambi: è un problema?

No. Vedere il valore due volte («nosniff, nosniff») perché sia la CDN sia l'origine lo impostano è del tutto normale e supera comunque il controllo. Non devi rimuoverne uno.

Correggere questo costa denaro?

No. La correzione è una riga di configurazione gratuita sul tuo server web o sulla CDN. Chi ti fa pagare per aggiungere un singolo header sta sovrafatturando. Le uniche cose per cui ha senso pagare in quest'area sono il monitoraggio continuo, una vista d'insieme su molti siti o un audit formale, non la correzione in sé.

In cosa si differenzia da una Content Security Policy (CSP)?

Si completano a vicenda. La CSP controlla quali script e risorse sono autorizzati a caricarsi; nosniff impedisce al browser di classificare male un file che effettivamente carica. Ti servono entrambi. nosniff è molto più semplice e veloce da aggiungere, quindi è un buon primo passo verso una CSP completa.