Przejdź do treści
Bezpieczeństwo

Content Security Policy (CSP)

Opublikowano:
Aktualizacja:

Content Security Policy (CSP) to mechanizm bezpieczeństwa przeglądarki sterowany nagłówkiem HTTP Content-Security-Policy, w którym witryna deklaruje dozwolone źródła zasobów: skryptów, stylów, obrazów, fontów czy połączeń sieciowych. Przeglądarka blokuje zasoby poza polityką, o ile polityka jest poprawnie skonfigurowana i egzekwowana.

CSP ogranicza skutki części ataków XSS i nieautoryzowanego ładowania zasobów; nie zastępuje bezpiecznego kodu, kontroli dostępu ani testów bezpieczeństwa. Dyrektywy takie jak frame-ancestors pomagają też przeciw clickjackingowi. Przykładowy nonce w dokumentacji jest ilustracją. W produkcji każda odpowiedź powinna dostać nową, nieprzewidywalną wartość.

Kluczowe dyrektywy

  • default-src: wartość zastępcza dla dyrektyw pobierania zasobów; nie obejmuje m.in. frame-ancestors, base-uri ani form-action.
  • script-src / style-src: źródła skryptów i stylów; nowoczesne polityki używają nonce lub hashy zamiast list domen.
  • frame-ancestors: kto może osadzić stronę w iframe (ochrona przed clickjackingiem).
  • report-to / report-uri: raportowanie naruszeń polityki do wskazanego endpointu.

Jak wdrażać bezpiecznie

Zacznij od trybu Content-Security-Policy-Report-Only, który tylko raportuje naruszenia bez blokowania, przeanalizuj raporty i dopiero potem egzekwuj politykę. Unikaj 'unsafe-inline' i szerokich whitelist. Rekomendowany kierunek to strict CSP oparty na nonce z 'strict-dynamic'.

Przykład

Przykład wymaga rzeczywistego odbiornika raportów pod podanym adresem. NONCE_BASE64 zastąp świeżą, kryptograficznie losową wartością dla każdej odpowiedzi; tę samą wartość wpisz do nagłówka i dozwolonego skryptu. Nie kopiuj stałego nonce do produkcji.

Nagłówki HTTP, tryb raportowania
HTTP
Reporting-Endpoints: csp-endpoint="https://example.com/csp-reports"
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'nonce-NONCE_BASE64' 'strict-dynamic'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; report-to csp-endpoint
Ten sam nonce w skrypcie
HTML
<script nonce="NONCE_BASE64" src="/app.js"></script>

Test przed egzekwowaniem

Na środowisku testowym dodaj skrypt bez nonce i sprawdź komunikat naruszenia oraz odbiór raportu. W Report-Only skrypt nadal może działać. Po przejściu na Content-Security-Policy powinien zostać zablokowany; sprawdź też formularze, logowanie, płatności i zasoby zewnętrzne. Raporty mogą zawierać URL-e: ogranicz ich dane, dostęp i czas przechowywania.

Źródła i dalsza lektura

Sprawdź publiczne sygnały bezpieczeństwa

Insight analizuje nagłówki, TLS i inne widoczne sygnały, bez obietnicy pentestu.