ARK. B19Parametr monitoringuBezpieczeństwo · lista 50 parametrów

X-Content-Type-Options

ważność średniamierzonysposób security_headers

Nagłówek nosniff zapobiega zgadywaniu typu pliku przez przeglądarkę (wektor XSS).

ARK. 1

WIKI

artykuł z 16.09.2026 · źródeł 8

Nagłó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].

RYS. 1.1Plik z błędnym typem wczytany jako skrypt

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].

RYS. 1.2Decyzja przeglądarki o typie odpowiedzi

Standardy i specyfikacje

  • Fetch Standard (WHATWG) definiuje algorytm ustalania nosniff i blokowania skryptów oraz stylów; jedyną poprawną wartością jest nosniff, 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 authoritative w nagłówku Content-Type na osobny nagłówek X-Content-Type-Options: nosniff, bo operatorzy serwerów uznali atrybut za trudny we wdrożeniu [6]. W IE6 i IE7 plik text/plain zawierający HTML był interpretowany jako HTML, a w IE8 z nosniff wyświetlany jako tekst [6].
  • OWASP zaleca X-Content-Type-Options: nosniff i poprawne ustawianie Content-Type w całej witrynie [5]. MDN zauważa, że testerzy bezpieczeństwa stron zwykle oczekują tego nagłówka i prawidłowego Content-Type dla 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ź serweraKontekstSkutek w przeglądarce
text/javascript + nosniffskryptwczytany [1]
text/plain + nosniffskryptzablokowany [1]
text/plain, bez nosniffskryptFetch nie blokuje [1]
image/png, bez nosniffskryptzablokowany niezależnie od nagłówka [1]
text/html + nosniffarkusz stylówzablokowany, bo typ nie jest text/css [1]
X-Content-Type-Options: foo, nosniffskrypt lub stylnosniff nie obowiązuje, liczy się pierwsza wartość [1]
text/plain z treścią HTML + nosniffdokumentwyświetlony jako tekst [3]
brak Content-Type, treść zaczyna się od <!DOCTYPE HTML, bez nosniffdokumentmoże zostać rozpoznany jako text/html [2]
brak Content-Type + nosniffdokumentwzorce HTML nie są sprawdzane [2] [3]
text/plain z treścią HTML w IE6 i IE7 (2008)dokumentzinterpretowany jako HTML [6]
TAB. 1.1Przypisy8
  1. [1] Fetch Standard — X-Content-Type-Options header · WHATWG
  2. [2] MIME Sniffing Standard · WHATWG
  3. [3] X-Content-Type-Options header · MDN Web Docs
  4. [4] MIME types (IANA media types) · MDN Web Docs
  5. [5] HTTP Security Response Headers Cheat Sheet · OWASP
  6. [6] Eric Lawrence — IE8 Security Part VI: Beta 2 Update (2008) · Microsoft
  7. [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. [8] File Upload Cheat Sheet · OWASP
ARK. 2

STATS

wyniki z systemu · tylko liczby zbiorcze
TAB. 2.1Odczyty per strona

Ten 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.

TAB. 2.3Ustalenia

Ten parametr nie otworzył jeszcze żadnego ustalenia w bazie LAB247. Pusto nie znaczy „czysto” — znaczy, że nic nie przekroczyło reguły.

TAB. 2.4Przebiegi z tym sposobem sprawdzeniaod 09.09.2026
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
ARK. 3

CARD

karta z kodu CREATO_PING, odczyt 16.09.2026
RYS. 3.1Droga parametru przez system: X-Content-Type-Options
TAB. 3.1Pomiarpliki: 4
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 helpersposób security_headers · CREATO_PING/helpers/security_headers.py
Testy
  1. Tylko przebieg P3; domena bez rekordu A pominięta na wstępie; strony w przebiegu sprawdzane po kolei.
  2. HEAD https://domena (wyłącznie strona główna) z podążaniem za przekierowaniami — nagłówki czytane tylko z odpowiedzi końcowej; kod 405 = druga próba GET.
  3. Sprawdzana tylko obecność X-Content-Type-Options na stronie głównej; wartość nie jest czytana, skrypty, style i przesłane pliki nie są pobierane.
  4. Jedno żądanie obsługuje sześć nagłówków bezpieczeństwa.
Typ wyniku0 albo 1 ustalenie missing_nosniff — w produkcji odrzucane w przebiegu, zanim cokolwiek je zapisze
Jednostkabrak — wynik jakościowy (obecność nagłówka)
Próg i regułaTimeout 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łaCREATO_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
  1. Mierzony jest dokument strony głównej, a przeglądarka nie zgaduje typu, gdy serwer podał text/html — tam nosniff niczego nie zmienia. Nagłówek działa na skryptach, stylach i przesłanych plikach, których helper nie pobiera.
  2. Wartość nie jest czytana: nagłówek z wartością inną niż nosniff przechodzi jako ok, choć przeglądarka go wtedy nie uznaje.
  3. Dwie bramki, opisana jedna: samo gate=true w polityce nic nie zmieni, bo ustalenie odpada wcześniej na filtrze powagi — trzeba też podnieść powagę w helperze.
  4. Powaga niespójna: helper normalna, polityka i katalog ustaleń niska.
  5. Błąd sieci albo timeout zwraca pustą listę — nieodróżnialne od „nagłówek jest”; odpowiedź 403 z WAF-a albo 5xx oceniana jak zwykła strona.
kandydaci do pętli: kod a opis parametru albo specyfikacja
Karta przepisana zCREATO_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
TAB. 3.2Co oznacza failtypów ustaleń: 1

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.

UstaleniePowagaPewnośćSkutekSubtask / alarmCo zrobić
Brak X-Content-Type-Optionsmissing_nosniffNiskieEwidentnebez wpływunie / nieDodaj X-Content-Type-Options: nosniff.
ARK. 4

LOOP

bez pętli
RYS. 4.1Pętla parametru — sześć etapów
TAB. 4.1Trafność, 30 dnialarmy · prawdziwe · fałszywe · bez rozstrzygnięcia

Trafnoś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.

TAB. 4.2Pętle

Ten parametr nie przeszedł jeszcze żadnej pętli. Kolejność po pierwszych pięciu grupach ustali miara trafności.

Blog 24/7
20.09Zastrzeżony PESEL: zmiana raz na 30 minut, blokada przy wypłaciedobreprogramy.pl20.09Fałszywe SMS-y od GITD o mandacie za autostradę wyłudzają dane kartyinstalki.pl20.09Pakiet npm indexed-btree omija blokadę skryptów instalacyjnychbleepingcomputer.com19.09SolarWinds łata CVE-2026-28326 w Access Rights Manager, zdalny kod bez logowaniathehackernews.com19.09Orkes Conductor: luka CVE-2026-58138 atakowana w sieci, poprawka w wersji 3.30.2thehackernews.com19.09Trzy luki jądra Linux w katalogu CISA KEV, Red Hat potwierdza aktywne atakithehackernews.com18.09Publiczne exploity na cztery luki jądra Linux dają lokalnie uprawnienia rootthehackernews.com18.09Brevo: skradziony klucz API Cloudflare i skrypty ClickFix na stronach klientówbleepingcomputer.com18.09WaterPlum z Korei Północnej zainfekowała 30 000 urządzeń w 100 krajachtherecord.media18.09Jedna zgoda OAuth daje napastnikowi dostęp do poczty i plików mimo MFAdarkreading.com