Blog 24/7
ARK. B19Parametr monitoringuBezpieczeństwo · lista 87 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
0przebiegów
Ostatni
19.09.2026start przebiegu
Stron w przebiegach
—33 przebiegów bez liczby stron
ARK. 3

CARD

karta z kodu CREATO_PING, odczyt 22.09.2026

Jak ten parametr trafia do ClickUpa: wynik sondy to linia w subtasku 2. Pomiar, a usterka, którą otwiera — linia w subtasku 1. Podsumowanie (z identyfikatorem CWE i kategorią OWASP), skąd liczy się wskaźnik zagrożenia i status strony. Projekcja z bazy skanera odświeża oba subtaski co godzinę. Do 22.09 każde ustalenie dostawało własny subtask i status ze starego słownika (PODATNA, WARNING…) — te słowa zostały jeszcze w części opisów pomiaru niżej jako język wewnętrzny sond.

RYS. 3.1Droga parametru przez system: X-Content-Type-Options
TAB. 3.1Pomiarpliki: 6
Obszar i ważnośćBezpieczeństwo · średnia (B19)
Workflow i częstotliwośćcreato_ping_security_v2 · P3 działa na LAB247Skaner 2.0, rytm „p3” / „bezpieczenstwo”: premium co 6 h, reszta co 24 h (tier 1–3), co 9 dni (tier 4) · 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 → do_writera (bramka gate z polityki; sito powagi zniknęło 18.09)CREATO_PING/config/incident_policy.toml → [finding] missing_nosniff
Retencja odczytówSurowy pomiar jako NIEZMIENNY wiersz tabeli `odczyty` w bazie skanera (wejście, wyjście, dowody, sha karty sondy i helpera, commit kodu) — trigger odrzuca każdą zmianę. Okno retencji z kohorty: 90 dni premium, 30 dni reszta; poza oknem zostają odczyty z werdyktem problemu, akcją albo etykietą, bo replay reguł ich potrzebuje (`skaner/retencja.py`). Do LAB247 ten kanał nie idzie (do bazy serwisu jadą dziś tylko sprawdzenia dostępności), więc poza odczytem zostaje werdykt w tabeli `werdykty` i sprawa w tabeli `sprawy`.
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. Severity 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/skaner/klasyfikacja.py · CREATO_PING/skaner/usterki.toml · CREATO_PING/skaner/ocena.py · odczyt 22.09.2026
TAB. 3.2Co oznacza failtypów Findingów: 1

missing_nosniff: bramka polityki zamknięta (gate=false) — zostaje odczyt i werdykt „bez_subtaska” w bazie skanera, sprawa nie powstaje, więc usterka „Brak nagłówka blokującego zgadywanie typu pliku” (waga 1) nie wchodzi do wskaźnika strony. Utwardzenie, nie incydent (waga 1 w katalogu usterek).

KodFindingSeverityPewnośćSkutekFinding / alarmWaga → ocenaCo zrobić
B19.01Brak X-Content-Type-Optionsmissing_nosniffNiskaEwidentnebez wpływunie / niewaga 1 → ocena 2 (zielony)Dodaj X-Content-Type-Options: nosniff.
TAB. 3.3B19.01 · Brak X-Content-Type-Optionswersja 1 · 01.10.2026
Kod i kluczB19.01 · missing_nosniff · w tabeli typów
Co znaczyPrzeglądarka może zgadywać typ pliku (MIME sniffing).
Kiedy powstajeEmitowany, gdy w nagłówkach odpowiedzi (nazwy lowercase) brak 'x-content-type-options'.Tylko p3. Jedno żądanie HEAD {scheme}://{domena} (UA „CREATO_PING-secheaders/1.0”, follow_redirects, timeout 6 s / connect 2 s); przy 405 powtórka GET. Sprawdzane nagłówki odpowiedzi końcowej bez względu na kod statusu; wartość nie jest walidowana (liczy się sama obecność nazwy). Błąd httpx = brak jakichkolwiek findingów nagłówków. Wartość (nosniff) nie jest sprawdzana.
Severity · pewnośćNiska · Ewidentne
Skutek dla stronybez wpływu · tylko statystyka (gate=false) · alarm nie
Waga → ocenawaga 1 → ocena 2 (zielony)
KlasyfikacjaCWE: CWE-693 (Protection Mechanism Failure)OWASP Top 10:2025: A02:2025 Security MisconfigurationOWASP ASVS 5.0.0: 3.4.4OCSF 1.9.0: Compliance Finding (class_uid 2003)
Rekord OCSFfinding_info.analytic.uid = "B19.01" · analytic.name = "missing_nosniff" · finding_info.types = ["B19 X-Content-Type-Options"]
Co zrobićDodaj X-Content-Type-Options: nosniff.
Wersje typu
  1. v1 · 01.10.2026 — kod B19.01 nadany (finding-codes.ts)
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
05.11CISA i FBI wzywają do zabezpieczenia sterowników chłodzenia po atakach w Europietherecord.media05.11Midnight Blizzard atakowała iPhone'y i Androidy przez zainfekowane strony w Europie i USAsecurityweek.com05.11APT29 kradła dane z iPhone'ów i Androidów przez przejęte i podrobione stronytherecord.media05.11Grupa APT29 przejęła skrypt Plerdy i atakowała niezałatane iPhone'y i Androidythehackernews.com05.11Microsoft wykrył 7,3 mld wiadomości phishingowych w III kwartale 2026microsoft.com05.11DigiCert ujawnia wyciek danych klientów i skanów dokumentów tożsamościbleepingcomputer.com05.11CWPdoor podmienia serwer cwpsrv w Control Web Panel i otwiera tylne wejście do Linuksableepingcomputer.com05.11Brytyjskie NCSC ostrzega, że narzędzia AI zwiększyły liczbę wykrywanych luk zero-daythehackernews.com05.11Skaner RootEvidence sprawdza starą lukę w Cisco IOS i dodaje nagłówki Opt-Outisc.sans.edu05.11Włamanie do portalu grantowego Norad, zagrożone dane 20 614 użytkownikówhelpnetsecurity.com