Część 3 serii „Bezpieczeństwo stron w UE: 10 kroków do lepszej oceny"
Dlaczego CSP ma znaczenie
Cross-Site Scripting (XSS) jest najczęstszą podatnością aplikacji webowych od ponad 20 lat. Atakujący wstrzykuje JavaScript do Twojej witryny — przez formularz, parametr URL, komentarz. Przeglądarka odwiedzającego wykonuje kod, ponieważ nie potrafi odróżnić go od prawidłowej zawartości strony.
Content Security Policy (CSP) rozwiązuje ten problem: jawnie definiujesz, z jakich źródeł przeglądarka może akceptować skrypty, style, obrazy i inne zasoby. Wszystko inne jest blokowane.
Wskaźnik wdrożenia w UE: 10,8%. Dziewięć na dziesięć witryn nie ma nagłówka CSP.
Co mówią dane
Z SiteGuardian Benchmark obejmującego ponad 700 000 europejskich witryn:
- 10,8% ma nagłówek CSP
- Witryny z security.txt mają CSP w 47% przypadków — 4,7x częściej
- Permissions-Policy (powiązany nagłówek): tylko 6,4%
Wdrażanie CSP krok po kroku
Największa przeszkoda: zbyt restrykcyjne CSP psuje stronę. Google Analytics przestaje się ładować, osadzone filmy YouTube znikają, style inline przestają działać.
Krok 1: Tryb Report-Only (nic nie psuje)
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
Przeglądarka raportuje naruszenia, ale niczego nie blokuje. Widzisz, jakich zewnętrznych źródeł używa Twoja strona, bez ryzyka awarii.
Krok 2: Zidentyfikuj źródła
Monitoruj raporty przez 1-2 tygodnie. Typowe źródła, które trzeba będzie dopuścić:
- Google Analytics:
https://www.googletagmanager.com https://www.google-analytics.com - Google Fonts:
https://fonts.googleapis.com https://fonts.gstatic.com - YouTube Embeds:
https://www.youtube.com https://www.youtube-nocookie.com - Twoje CDN:
https://cdn.twoja-domena.pl
Krok 3: Zbuduj politykę
Content-Security-Policy: default-src 'self'; script-src 'self' https://www.googletagmanager.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src https://fonts.gstatic.com; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com
Krok 4: Aktywuj
Usuń -Report-Only z nazwy nagłówka. Dokładnie przetestuj stronę.
Kluczowe dyrektywy
| Dyrektywa | Kontroluje | Zalecenie |
|---|---|---|
default-src |
Domyślne dla wszystkiego | 'self' |
script-src |
JavaScript | 'self' + jawne domeny |
style-src |
CSS | 'self' 'unsafe-inline' (często konieczne) |
img-src |
Obrazy | 'self' data: https: |
font-src |
Czcionki | 'self' + Google Fonts w razie potrzeby |
connect-src |
XHR/Fetch | 'self' + domeny API |
frame-src |
iframe | Tylko jawne domeny |
object-src |
Flash/Java | 'none' (zawsze) |
base-uri |
Tag base | 'self' |
Nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://www.googletagmanager.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; object-src 'none'; base-uri 'self'" always;
Apache
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' https://www.googletagmanager.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; object-src 'none'; base-uri 'self'"
Typowe błędy
1. unsafe-inline dla skryptów. script-src 'unsafe-inline' pozwala na dowolny skrypt inline — czyniąc całe CSP bezużytecznym przeciwko XSS. Używaj nonce'ów lub haszy zamiast tego.
2. * jako źródło. default-src * pozwala na wszystko ze wszystkich miejsc. To nie jest polityka, to placebo.
3. Zbyt restrykcyjny start. Zawsze zaczynaj od Report-Only. CSP, które psuje stronę i zostaje natychmiast wyłączone, nikogo nie chroni.
Kontekst regulacyjny
- NIS2 art. 21 ust. 2 lit. d) — bezpieczeństwo w rozwoju i utrzymywaniu systemów informatycznych
- RODO art. 32 — XSS może prowadzić do naruszeń danych (przejęcie sesji, kradzież ciasteczek)
- PCI DSS 4.0 — wymaganie 6.4.3 jawnie nakazuje CSP dla stron płatności
Sprawdź swoje CSP
SiteGuardian nie tylko wykrywa, czy nagłówek CSP istnieje, ale analizuje dyrektywy pod kątem znanych słabości:
W następnym tygodniu w części 4: DNSSEC — dlaczego 84% domen w UE nie ma ochrony przed spoofingiem DNS.