CAI Technology
Menu ☰
aegis · · 4 min citire

X-Content-Type-Options nosniff: anti-MIME sniffing pentru aplicațiile voastre web

MIME sniffing permite browserelor să interpreteze fișiere greșit, deschizând calea XSS prin upload-uri. Un singur header HTTP elimină vectorul.

CAI Technology · Ultima revizuire: 09.05.2026
X-Content-Type-Options nosniff: anti-MIME sniffing pentru aplicațiile voastre web

Pe scurt

Browserele istorice (în special Internet Explorer) făceau MIME-sniffing: dacă Content-Type declarat de server nu corespundea conținutului real, browserul deducea tipul. Comportamentul a fost util pentru compatibilitate (servere prost configurate care setau toate ca text/plain) — dar a deschis o categorie de atacuri unde fișiere uploade legitim erau interpretate ca cod executabil.

Header-ul X-Content-Type-Options: nosniff instruiește browserul să respecte strict Content-Type-ul declarat. E un fix simplu, low-effort, de aplicat universal. Fără excepții.

Atacul concret: XSS prin upload de profile picture

Site-ul vostru permite upload de profile picture. User-ul “atacator” trimite un fișier:

Browser modern fără MIME sniffing → respectă image/jpeg, încearcă să-l decodeze ca imagine, eșuează, gata.

Browser vechi (Internet Explorer) sau orice browser fără nosniff → “uite, conținutul arată ca HTML, hai să-l interpretez ca HTML” → execută script-ul în domeniul vostru → XSS stocat cu drepturile altor utilizatori care vizualizează poza.

Anatomia atacului — și cum nosniff îl blochează

Fără X-Content-Type-Options:

  1. User normal vizitează profilul atacatorului
  2. Browser face GET la /profile-pics/evil.jpg
  3. Server răspunde Content-Type: image/jpeg + conținut HTML
  4. Browser detectează că nu-i imagine validă → încearcă inferență → găsește <script> → interpretează ca HTML
  5. Script rulează în origin-ul site-ului vostru → XSS stocat

Cu X-Content-Type-Options: nosniff:

  1. Browser primește Content-Type: image/jpeg
  2. Conținutul nu se decodează ca imagine → afișează imagine ruptă
  3. Niciun cod executat → atac eșuează

Implementare pas-cu-pas

Pas 1 — Setare la nivel server (recomandat universal)

nginx:

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

Apache:

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

Caddy: automat în 2026 — sau explicit:

header X-Content-Type-Options nosniff

Express (Node.js) cu Helmet:

const helmet = require('helmet');
app.use(helmet.noSniff());

Cloudflare Workers / Edge:

response.headers.set('X-Content-Type-Options', 'nosniff');

Pas 2 — Verificare

curl -I https://firma.ro | grep -i x-content-type

Răspuns așteptat:

X-Content-Type-Options: nosniff

Pas 3 — Aplicare la API endpoints

API-urile JSON sunt și ele vulnerabile dacă nu setați content-type corect. Combinați:

Verificați și fixurile complementare

nosniff nu rezolvă singur problemele de upload securizat. Best practice complete:

  1. Validare server-side a fișierelor — magic bytes verification (nu doar extensie)
  2. Storage separat — fișierele utilizatorilor pe domeniu/subdomain separat (uploads.firma.ro vs firma.ro) pentru izolare origin
  3. Content-Disposition: attachment pentru fișiere care nu trebuie afișate inline
  4. Permissions-Policy restrictivă

Combinația nosniff + storage izolat + validare = protecție straight-forward.

Confuzii frecvente

nosniff îmi rupe site-ul.” — Practic niciodată. Singurul scenariu: dacă serverul vostru returnează Content-Type: text/plain pentru fișiere .css sau .js (greșit configurat) — browserul le va refuza ca CSS/JS. Soluția = fix server config, nu skip nosniff.

“E suficient Content-Type corect, fără nosniff.” — Edge cases multe (proxy-uri care strip headers, browsere vechi, configurări diverse). nosniff e cheap insurance.

“Nu am form-uri de upload, deci nu mă afectează.” — Upload-urile sunt vectorul cel mai vizibil, dar nu singurul. Orice endpoint care întoarce date controlate de utilizator (comments API, file viewer, etc.) e potential vulnerable.

Verificați acum

ARTEMIS detectează lipsa X-Content-Type-Options: nosniff în orice scanare Site (2 EUR) — împreună cu CSP, HSTS, X-Frame, Referrer-Policy și 30+ alte verificări.


🔗 Soluții complementare CAI Technology


tehnic@caitech.ro

Începem cu o conversație de 30 de minute.

Audit AI-readiness gratuit pentru companii peste 50 angajați. Răspundem în 24 de ore.