X-Content-Type-Options
ważność średniamierzonysposób security_headers
Nagłówek nosniff zapobiega zgadywaniu typu pliku przez przeglądarkę (wektor XSS).
WIKI
artykuł z 16.09.2026 · źródeł 8Nagłówek X-Content-Type-Options to parametr monitoringu stron internetowych, który sprawdza, czy odpowiedź serwera zawiera nagłówek X-Content-Type-Options. Pomiar kończy się jednym z trzech wyników: nagłówek obecny, brak nagłówka albo nie udało się pobrać odpowiedzi. Nagłówek z wartością nosniff mówi przeglądarce, że typy MIME podane w nagłówku Content-Type zostały ustawione celowo i należy ich przestrzegać, a nie zmieniać [3].
Jak działa
Nagłówek Content-Type ma wskazywać typ MIME odpowiedzi, ale wiele serwerów podaje wartość niezgodną z zawartością, dlatego przeglądarki od dawna badają także samą treść, żeby ustalić jej faktyczny typ [2]. To zgadywanie po bajtach zasobu nazywa się MIME sniffing; każda przeglądarka robi je inaczej, a część typów MIME oznacza treść wykonywalną [4]. O sposobie przetworzenia adresu decyduje typ MIME, a nie rozszerzenie pliku [4].
Standard Fetch definiuje nagłówek w dwóch krokach. Najpierw przeglądarka ustala, czy obowiązuje nosniff: liczy się tylko pierwsza wartość nagłówka, porównywana bez względu na wielkość liter [1]. Potem, jeśli nosniff obowiązuje, blokuje odpowiedź na żądanie skryptu, gdy typ nie jest typem JavaScript albo go brak, oraz odpowiedź na żądanie arkusza stylów, gdy typ nie jest text/css [1]. Specyfikacja wyjaśnia, że obejmuje tylko te dwa rodzaje żądań, bo to ich dotyczą znane ataki, a objęcie obrazów okazało się niezgodne z istniejącymi treściami [1]. Niezależnie od nagłówka Fetch blokuje jako skrypt odpowiedzi z typem image/*, audio/*, video/* i text/csv [1].
Dla pozostałych odpowiedzi, także przy przejściu do nowego dokumentu, przeglądarka z nosniff używa podanego Content-Type bez badania treści [3]. Odpowiedź z typem text/plain nie zostanie wtedy potraktowana jako HTML, nawet jeśli zawiera znaczniki HTML [3]. Standard MIME Sniffing opisuje to szczegółowo: typ HTML lub XML podany przez serwer nigdy nie jest zmieniany [2]. Gdy typu brak albo jest nieznany, np. unknown/unknown lub */*, przeglądarka rozpoznaje go po początkowych bajtach, a wzorce typów „skryptowalnych” (HTML, XML, PDF) sprawdza tylko wtedy, gdy zgadywanie nie zostało wyłączone [2]. Przy wyłączonym zgadywaniu obliczony typ jest po prostu typem podanym przez serwer [2].
Standardy i specyfikacje
- Fetch Standard (WHATWG) definiuje algorytm ustalania
nosniffi blokowania skryptów oraz stylów; jedyną poprawną wartością jestnosniff, bez rozróżniania wielkości liter [1]. - MIME Sniffing Standard (WHATWG) powstał, bo przeglądarki odtwarzały nawzajem swoje algorytmy zgadywania, co dawało rozbieżne zachowania, w części ze skutkami dla bezpieczeństwa [2]. Algorytm wywodzi się z badań Adama Bartha, Juana Caballero i Dawn Song [2]. Standard nie używa rozszerzeń plików do ustalania typu zasobu pobranego przez HTTP, bo są zawodne i łatwe do podrobienia [2].
- Historia. Microsoft w 2008 roku, przy Internet Explorer 8 Beta 2, zamienił zapowiadany wcześniej atrybut
authoritativew nagłówkuContent-Typena osobny nagłówekX-Content-Type-Options: nosniff, bo operatorzy serwerów uznali atrybut za trudny we wdrożeniu [6]. W IE6 i IE7 pliktext/plainzawierający HTML był interpretowany jako HTML, a w IE8 znosniffwyświetlany jako tekst [6]. - OWASP zaleca
X-Content-Type-Options: nosniffi poprawne ustawianieContent-Typew całej witrynie [5]. MDN zauważa, że testerzy bezpieczeństwa stron zwykle oczekują tego nagłówka i prawidłowegoContent-Typedla wszystkich zasobów [3].
Zagrożenia i skutki
Pomylenie typów. OWASP opisuje zgadywanie typu jako mechanizm, który może zamienić typ niewykonywalny w wykonywalny, i nazywa to atakami MIME confusion [5].
XSS przez przesłane pliki. Według standardu MIME Sniffing problem jest najpoważniejszy, gdy uczciwy serwer pozwala użytkownikom przesyłać pliki i serwuje je z typem o niskich uprawnieniach [2]. Jeśli serwer uważa plik za obraz, a przeglądarka za HTML, atakujący może ukraść dane uwierzytelniające użytkownika i przeprowadzić inne ataki XSS [2].
Dokumenty-kameleony. Barth, Caballero i Song (2009) opisali pliki, które są jednocześnie poprawne w nieszkodliwym formacie i zawierają HTML [7]. Autor mógł przesłać do systemu recenzji HotCRP pracę w PostScripcie, którą Internet Explorer 7 traktował jako HTML; skrypt działał wtedy w imieniu recenzenta i mógł wystawić pracy wysoką ocenę [7]. W Wikipedii podobny atak wykorzystywał plik będący jednocześnie obrazem GIF i dokumentem HTML [7]. Zasady bezpiecznego zgadywania z tej pracy przyjęły częściowo Internet Explorer 8, a w całości Google Chrome i grupa robocza HTML5 [7].
Pliki od użytkowników. Typ Content-Type przesłanego pliku podaje użytkownik, więc łatwo go podrobić [8]. Publicznie dostępne pliki mogą nieść aktywną treść po stronie klienta, np. XSS lub CSRF, groźną dla innych użytkowników [8]. OWASP zaleca przechowywanie ich na osobnym hoście i podkreśla, że żadna pojedyncza technika nie wystarcza [8].
Granice nagłówka. Blokada w Fetch dotyczy wyłącznie skryptów i arkuszy stylów [1]. Nagłówek nie naprawia błędnego Content-Type: skrypt serwowany z nieprawidłowym typem i nosniff przestaje się wczytywać [1], a źle skonfigurowane typy MIME psują działanie stron [4]. Decyzja zapada dla każdej odpowiedzi osobno, na podstawie jej własnej listy nagłówków [1].
Przykłady
| Odpowiedź serwera | Kontekst | Skutek w przeglądarce |
|---|---|---|
text/javascript + nosniff | skrypt | wczytany [1] |
text/plain + nosniff | skrypt | zablokowany [1] |
text/plain, bez nosniff | skrypt | Fetch nie blokuje [1] |
image/png, bez nosniff | skrypt | zablokowany niezależnie od nagłówka [1] |
text/html + nosniff | arkusz stylów | zablokowany, bo typ nie jest text/css [1] |
X-Content-Type-Options: foo, nosniff | skrypt lub styl | nosniff nie obowiązuje, liczy się pierwsza wartość [1] |
text/plain z treścią HTML + nosniff | dokument | wyświetlony jako tekst [3] |
brak Content-Type, treść zaczyna się od <!DOCTYPE HTML, bez nosniff | dokument | może zostać rozpoznany jako text/html [2] |
brak Content-Type + nosniff | dokument | wzorce HTML nie są sprawdzane [2] [3] |
text/plain z treścią HTML w IE6 i IE7 (2008) | dokument | zinterpretowany jako HTML [6] |
- [1] Fetch Standard — X-Content-Type-Options header · WHATWG
- [2] MIME Sniffing Standard · WHATWG
- [3] X-Content-Type-Options header · MDN Web Docs
- [4] MIME types (IANA media types) · MDN Web Docs
- [5] HTTP Security Response Headers Cheat Sheet · OWASP
- [6] Eric Lawrence — IE8 Security Part VI: Beta 2 Update (2008) · Microsoft
- [7] Adam Barth, Juan Caballero, Dawn Song — Secure Content Sniffing for Web Browsers, or How to Stop Papers from Reviewing Themselves (2009) · IEEE Symposium on Security and Privacy
- [8] File Upload Cheat Sheet · OWASP
STATS
wyniki z systemu · tylko liczby zbiorczeTen parametr nie zapisuje odczytu per strona — przebieg zostawia tylko ustalenia, więc liczby sprawdzonych stron i wyników „ok” system nie ma. Pojawią się po wdrożeniu zapisu przebiegów per strona per parametr.
Ten parametr nie otworzył jeszcze żadnego ustalenia w bazie LAB247. Pusto nie znaczy „czysto” — znaczy, że nic nie przekroczyło reguły.
- Przebiegów
- 33sposób security_headers
- W 30 dni
- 33przebiegów
- Ostatni
- 19.09.2026start przebiegu
- Stron w przebiegach
- —33 przebiegów bez liczby stron
CARD
karta z kodu CREATO_PING, odczyt 16.09.2026| Obszar i ważność | Bezpieczeństwo · średnia (B19) |
|---|---|
| Workflow i częstotliwość | creato_ping_security_v2 · P3 działa na LAB247cron co 24 h, T1–T3; T4 raz po anomalii · Dokładny skan. dns_integrity porównuje NS, MX, SPF i DMARC z wzorcem z poprzedniego przebiegu. |
| Sonda i helper | sposób security_headers · CREATO_PING/helpers/security_headers.py |
| Testy |
|
| Typ wyniku | 0 albo 1 ustalenie missing_nosniff — w produkcji odrzucane w przebiegu, zanim cokolwiek je zapisze |
| Jednostka | brak — wynik jakościowy (obecność nagłówka) |
| Próg i reguła | Timeout 6,0 s, połączenie 2,0 s (stała w helperze). Reguła: brak nagłówka = missing_nosniff; nagłówek z dowolną wartością = ok. |
| Gdzie leżą pokrętła | CREATO_PING/helpers/security_headers.py → _CHECKS (powaga normal), _TIMEOUTCREATO_PING/helpers/security_runner.py → _TASK_SEVERITIES (dalej idą tylko urgent i high)CREATO_PING/config/incident_policy.toml → [finding] missing_nosniff |
| Retencja odczytów | Żadna: filtr powagi istniał, zanim powstał helper, więc według kodu to ustalenie nigdy nie trafiło do ClickUp ani do bazy LAB247. |
| Znane rozbieżności |
|
| Karta przepisana z | CREATO_PING/helpers/security_headers.py · CREATO_PING/helpers/security_runner.py · CREATO_PING/config/incident_policy.toml · CREATO_PING/workflows/_prod/creato_ping_security_v2.json · odczyt 16.09.2026 |
Helper zgłasza powagę normalną, a filtr przebiegu przepuszcza tylko pilną i wysoką — ustalenie odpada, zanim zostanie odczytana polityka incydentów. Przebieg produkcyjny idzie z --no-stats, więc nie zostaje nawet licznik. Wpis w polityce (gate=false) nie jest osiągany. Status strony bez zmian.
| Ustalenie | Powaga | Pewność | Skutek | Subtask / alarm | Co zrobić |
|---|---|---|---|---|---|
| Brak X-Content-Type-Optionsmissing_nosniff | Niskie | Ewidentne | bez wpływu | nie / nie | Dodaj X-Content-Type-Options: nosniff. |
LOOP
bez pętliTrafności jeszcze nie liczymy: zamknięcie subtaska nie niesie dziś werdyktu (prawdziwy / fałszywy / nie dało się sprawdzić). Cztery liczby pojawią się, gdy każde zamknięcie dostanie werdykt — to warunek startu pętli 1.
Ten parametr nie przeszedł jeszcze żadnej pętli. Kolejność po pierwszych pięciu grupach ustali miara trafności.