Content-Security-Policy
ważność średniamierzonysposób security_headers
Nagłówek CSP ogranicza źródła zasobów. Brak to brak warstwy ochrony przed XSS.
WIKI
artykuł z 16.09.2026 · źródeł 6Nagłówek Content-Security-Policy to parametr monitoringu stron internetowych, który sprawdza, czy odpowiedź serwera zawiera nagłówek Content-Security-Policy. Pomiar kończy się jednym z trzech wyników: nagłówek obecny, brak nagłówka albo nie udało się pobrać odpowiedzi. Content Security Policy (CSP) to mechanizm, którym twórca strony określa, jakie zasoby dokument może pobrać lub wykonać; ma ograniczać ryzyko ataków polegających na wstrzyknięciu treści [1].
Jak działa
Polityka składa się z dyrektyw. Dyrektywa default-src jest wartością zapasową dla pozostałych dyrektyw pobierania, a script-src wskazuje dozwolone źródła JavaScriptu i WebAssembly [2]. Gdy polityka zawiera default-src albo script-src, przeglądarka nie wykonuje skryptów osadzonych w kodzie HTML: elementów script z treścią, atrybutów obsługi zdarzeń, takich jak onerror, ani adresów javascript: [3]. Domyślnie blokowane są też eval() i podobne funkcje, chyba że polityka zawiera słowo unsafe-eval [3].
Skrypt osadzony można dopuścić słowem unsafe-inline, jednorazowym kodem (ang. nonce) albo skrótem kryptograficznym treści: SHA-256, SHA-384 lub SHA-512 [1]. Nonce musi być inny w każdej odpowiedzi HTTP i nieprzewidywalny [3]. Wyrażenie strict-dynamic pozwala skryptowi już dopuszczonemu ładować kolejne skrypty, więc zaufanie przechodzi dalej bez listy domen [1]. Skrypt wstrzyknięty przez atakującego nie zna właściwego nonce, więc przeglądarka odmawia jego wykonania i wysyła raport o naruszeniu [3].
Nagłówek Content-Security-Policy-Report-Only pozwala sprawdzić politykę bez jej egzekwowania: przeglądarka tylko monitoruje skutki [1]. Jeśli odpowiedź zawiera oba nagłówki, polityka z Content-Security-Policy jest egzekwowana, a polityka Report-Only generuje wyłącznie raporty [3]. Raporty trafiają do odbiorcy wskazanego dyrektywą report-to [2]. Kolejne nagłówki Content-Security-Policy mogą uprawnienia dokumentu tylko dalej zawężać [2].
Standardy i specyfikacje
- CSP Level 3 (W3C, szkic roboczy) definiuje dyrektywy, źródła nonce i hash, wyrażenie
strict-dynamicoraz nagłówek Report-Only. Dyrektywareport-tozastępuje wycofywanąreport-uri[1]. - Politykę można dostarczyć także elementem
metaz atrybutemhttp-equiv. W tej formie nie działają nagłówek Report-Only ani dyrektywyreport-uri,frame-ancestorsisandbox[1]. - OWASP zaleca politykę ścisłą
script-src 'nonce-{RANDOM}' 'strict-dynamic'; object-src 'none'; base-uri 'none';[4]. Dyrektywaframe-ancestorsogranicza osadzanie strony w ramkach, więc CSP chroni także przed clickjackingiem [4].
Zagrożenia i skutki
XSS bez drugiej warstwy. OWASP zastrzega, że CSP nie może być jedynym zabezpieczeniem przed XSS i nie zwalnia z dobrych praktyk programistycznych, takich jak kodowanie danych wyjściowych [4]. Bez polityki twórca strony nie kontroluje, jakie zasoby dokument pobiera i wykonuje [1], więc skrypt wstrzyknięty przez lukę w aplikacji działa jak każdy inny.
Polityka obecna, ale nieskuteczna. Weichselbaum, Spagnuolo, Lekies i Janc (Google, ACM CCS 2016) przeanalizowali 26 011 unikalnych polityk z 1 680 867 hostów [5]. Nieskutecznych okazało się 94,68% polityk, które próbowały ograniczyć wykonywanie skryptów, a 99,34% hostów z CSP używało polityk niedających korzyści wobec XSS [5]. Źródłem obejść były listy dozwolonych domen: 75,81% polityk używało list pozwalających obejść CSP, a 14 z 15 domen najczęściej dopuszczanych dla skryptów miało niebezpieczne punkty końcowe [5]. Autorzy zaproponowali polityki oparte na nonce z wyrażeniem strict-dynamic [5]. OWASP ostrzega podobnie, że zbyt szczegółowa albo zbyt liberalna polityka nieścisła prowadzi do obejść [4].
WordPress i skrypty osadzone. Przy ścisłej CSP każdy element script musi mieć atrybut nonce zgodny z polityką [6]. WordPress dodał funkcje przekazujące atrybuty, np. nonce, do znaczników skryptów, także osadzonych, dopiero w wersji 5.7 z 2021 roku; zespół rdzenia opisał to jako drogę do CSP w rdzeniu, wtyczkach i motywach [6]. Wtyczki i motywy nie powinny nadpisywać atrybutu nonce, jeśli nie odpowiadają za integrację z CSP [6]. Skrypt osadzony wypisany z pominięciem tych funkcji, bez nonce i bez skrótu, zostanie przez politykę ścisłą zablokowany [3].
Zbyt ostra polityka. Egzekwowana polityka blokuje także prawowite skrypty bez nonce albo skrótu [3], dlatego zmiany sprawdza się najpierw w trybie Report-Only [1].
Przykłady
| Nagłówek albo sytuacja | Skutek w przeglądarce |
|---|---|
| brak nagłówka | brak polityki: dokument pobiera i wykonuje zasoby bez ograniczeń CSP [1] |
default-src 'self' | zasoby z własnego pochodzenia; skrypty osadzone i eval() zablokowane [2] [3] |
script-src 'nonce-{RANDOM}' 'strict-dynamic'; object-src 'none'; base-uri 'none'; | polityka ścisła zalecana przez OWASP [4] |
script-src 'self' 'unsafe-inline' | skrypty osadzone dozwolone, także wstrzyknięte [1] [3] |
lista popularnych domen w script-src | w badaniu Google zwykle do obejścia [5] |
tylko Content-Security-Policy-Report-Only | raporty naruszeń, bez blokowania [1] |
polityka w elemencie meta | działa bez frame-ancestors, sandbox i report-uri [1] |
- [1] Content Security Policy Level 3 · W3C
- [2] Content-Security-Policy header · MDN Web Docs
- [3] Content Security Policy (CSP) · MDN Web Docs
- [4] Content Security Policy Cheat Sheet · OWASP
- [5] Weichselbaum, Spagnuolo, Lekies, Janc — CSP Is Dead, Long Live CSP! On the Insecurity of Whitelists and the Future of Content Security Policy (ACM CCS 2016) · Google Research
- [6] Introducing script attributes related functions in WordPress 5.7 · Make WordPress Core
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 (B20) |
|---|---|
| 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_csp |
| 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_csp; nagłówek z dowolną wartością, także pustą albo z unsafe-inline, = ok. |
| Gdzie leżą pokrętła | CREATO_PING/helpers/security_headers.py → _CHECKS, _TIMEOUTCREATO_PING/helpers/security_runner.py → _TASK_SEVERITIES (dalej idą tylko urgent i high)CREATO_PING/config/incident_policy.toml → [finding] missing_csp |
| Retencja odczytów | Żadna: ustalenie odpada w filtrze przebiegu, a przebieg z --no-stats nie zapisuje licznika. Z tego kanału nic nie trafia 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; nawet po przejściu filtra nie powstałby subtask. Utwardzenie, nie incydent.
| Ustalenie | Powaga | Pewność | Skutek | Subtask / alarm | Co zrobić |
|---|---|---|---|---|---|
| Brak Content-Security-Policymissing_csp | Niskie | Ewidentne | bez wpływu | nie / nie | Wdróż CSP, zaczynając od trybu report-only. |
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.