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
- 0przebiegów
- Ostatni
- 19.09.2026start przebiegu
- Stron w przebiegach
- —33 przebiegów bez liczby stron
CARD
karta z kodu CREATO_PING, odczyt 22.09.2026Jak 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.
| 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 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 → do_writera (bramka gate z polityki; sito powagi zniknęło 18.09)CREATO_PING/config/incident_policy.toml → [finding] missing_nosniff |
| Retencja odczytów | Surowy 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 |
|
| Karta przepisana z | CREATO_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 |
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).
| Kod | Finding | Severity | Pewność | Skutek | Finding / alarm | Waga → ocena | Co zrobić |
|---|---|---|---|---|---|---|---|
| B19.01 | Brak X-Content-Type-Optionsmissing_nosniff | Niska | Ewidentne | bez wpływu | nie / nie | waga 1 → ocena 2 (zielony) | Dodaj X-Content-Type-Options: nosniff. |
| Kod i klucz | B19.01 · missing_nosniff · w tabeli typów |
|---|---|
| Co znaczy | Przeglądarka może zgadywać typ pliku (MIME sniffing). |
| Kiedy powstaje | Emitowany, 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 strony | bez wpływu · tylko statystyka (gate=false) · alarm nie |
| Waga → ocena | waga 1 → ocena 2 (zielony) |
| Klasyfikacja | CWE: 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 OCSF | finding_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 |
|
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.