Czym jest CSP i dlaczego warto na nie zwrócić uwagę?
CSP oznacza Content Security Policy czyli Politykę Bezpieczeństwa Treści. Jest to zestaw instrukcji mówiących jakie treści z serwisów zewnętrznych mogą być uruchamiane na naszej platformie. Technicznie mówiąc modyfikowane są nagłówki protokołu http. W nich zawarta jest informacja które treści mogą zostać uruchomione, a które nie. Przed czym nas to chroni?
Główne dwa zagrożenia to Data Injection oraz Cross-Site Scripting (XSS).
W przypadku Data Injection czyli poprzez iniekcję danych atakujący wprowadza złośliwy kod lub szkodliwe dane na stronę celem zakłócenia działania systemu.
W XSS szkodliwy skrypt osadzany jest na zaufanej stronie internetowej i uruchamiany w przeglądarce użytkownika.
Zatem nie jesteśmy bezbronni. Lecz jak właściwie używać tego narzędzia?
Co do zasady składnia powinna wyglądać w następujący sposób:
Content-Security-Policy: policy
I po dwukropku, w miejscu przykładowego słowa
policy
podajemy odpowiednie dyrektywy. Może być jedna, może być kilka. Najważniejsze, żeby nasza polityka była dobrze przemyślana i żebyśmy naprawdę dobrze wiedzieli co chcemy uruchamiać na naszej stronie, a czego nie. Nasze dyrektywy będą chronić pojedyncze typy zasobów lub całe obszary polityki.
O czym należy pamiętać? Jeśli jakiś typ zasobu lub obszar polityki nie ma własnej dyrektywy to zostanie użyta wobec niego dyrektywa
default-src
lub
script-src
– co najmniej jedna z tych dwóch jest wymagana.
Pamiętajmy, że pośród wszystkich typów każdy z nich może mieć własną politykę. Może ona określać użycie obrazów, czcionek, mediów jak audio czy wideo a także skryptów.
Gdzie znajdziemy pełną listę dyrektyw? Chyba najlepszym źródłem będzie strona dla deweloperów prowadzona przez Fundację Mozilla.
Zróbmy zatem kilka przykładów.
Pierwszy z nich będzie dotyczyć HTMLa. Polityki piszemy w sekcji <head>:
<head>
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
</head>
Mamy tutaj ustawienie używania CSP oraz dyrektywę zezwalającą na uruchamianie wszystkiego, co pochodzi z serwera lokalnego.
A teraz załóżmy taki przykład – chcemy mieć wszystko, co jest na naszym serwerze, cokolwiek co pochodzi z dowolnej subdomeny domenty example.com oraz obrazki ze wszystkich możliwych miejsc:
Content-Security-Policy: default-src 'self' *.example.com; img-src *
Co najczęściej można spotkać w politykach?
Na pewno default-src oraz script-src. Często znajdziemy także img-src czy media-src.
Czy w moich politykach mogę dodawać więcej niż jeden adres wyjątku? Oczywiście!
Przykładowy wpis będzie wyglądać tak:
Content-Security-Policy: default-src 'self' *.example.com; img-src *.example.com *.google.com
A jak zablokować całkowicie jakiś typ czy obszar?
Zobaczmy na przykładową politykę blokady obiektów:
object-src 'none'
Wpisanie atrybuty 'none’ powoduje, że z obiekty nie będą uruchamiane z żadnego serwera, w tym własnego.
Bezpieczne? Zdecydowanie. Użyteczne? To zeleży.
Czy CSP można używać tylko w kodzie stron (jak HTML czy PHP)? Nie! Najlepiej jest go ustawić w konfiguracji naszego serwera WWW (Apache, nginx). W takim wypadku każda strona podlegająca pod daną konfigurację będzie używać danej polityki.
A oto przykład dla Apache:
Header set Content-Security-Policy-Report-Only "default-src 'self'; img-src *"
Proste? No pewnie! Każde z nas da sobie z tym radę. Wystarczy poświęcić zagadnieniu trochę czasu, poeksperymentować z naszą stroną i oraz z serwerem.
Jeśli mnie pamięć nie myli, to od wersji CSP 2.0 jest możliwość użycia dyrektywy
nonce
O niej opowiemy sobie następnym razem.