
Strona firmowa to dziś nie tylko wizytówka, ale też punkt styku z leadami, płatnościami, formularzami i narzędziami analitycznymi. To oznacza jedno: nawet jeśli nie masz panelu logowania i nie przetwarzasz „wrażliwych” danych, Twoja strona nadal może stać się celem. Najczęstszy scenariusz nie wygląda jak hollywoodzki atak, tylko jak drobna wpadka: ktoś podmienia skrypt zewnętrzny, wstrzykuje złośliwy kod przez podatny komponent, albo nakłada na Twoją stronę niewidoczną „ramkę”, by wyłudzać kliknięcia.
„Nagłówki bezpieczeństwa” to proste ustawienia po stronie serwera (lub CDN), które mówią przeglądarce: jak ma traktować Twoją stronę i czego ma nie pozwolić zrobić. Dobre wdrożenie potrafi:
W tym artykule dostajesz praktyczny zestaw: CSP, HSTS, SRI i ochrona przed clickjackingiem, plus kilka nagłówków „wspierających”, które zwykle warto dorzucić, gdy już robisz porządek.
Największy błąd to włączenie wszystkiego „na raz” i „na sztywno”. CSP i HSTS potrafią unieruchomić część serwisu, jeśli masz stare integracje, niestandardowe skrypty lub zasoby ładowane z różnych domen. Dlatego wdrażaj etapami:
Report-Only (jeśli masz gdzie zbierać raporty).preload i bez includeSubDomains, dopóki nie masz pełnej pewności.Druga zasada: bezpieczeństwo nagłówkami to nie plaster na złamaną nogę. Jeśli masz realną podatność (np. wtyczkę w CMS), nagłówki ograniczą skutki, ale nie zastąpią aktualizacji i napraw. Traktuj je jako pasy bezpieczeństwa: nie powstrzymają wypadku, ale potrafią uratować sytuację.
Content-Security-Policy to najważniejszy nagłówek w tej układance, bo działa bezpośrednio na ryzyko XSS. W skrócie: przeglądarka dostaje listę dozwolonych źródeł dla skryptów, styli, obrazów, fontów, połączeń do API, ramek itd. Jeśli w stronie pojawi się „obcy” skrypt albo próba wstrzyknięcia inline, CSP może to zablokować.
Dlaczego CSP jest trudny? Bo wiele stron marketingowych ma:
Najprostszy (i najbezpieczniejszy) kierunek to ograniczanie skryptów do własnej domeny, a integracje zewnętrzne dopisywać świadomie. Minimalna baza, od której często warto zacząć, wygląda tak (przykład ideowy, a nie „wklejka w ciemno”):
default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none';
Co te dyrektywy robią w praktyce?
default-src 'self' ustawia domyślne źródło na Twoją domenę.base-uri 'self' utrudnia manipulacje tagiem , które mogą zmieniać rozwiązywanie adresów zasobów.object-src 'none' blokuje stare wtyczki typu Flash/Silverlight (dziś rzadko, ale po co ryzykować).frame-ancestors 'none' (to też ochrona przed clickjackingiem) mówi, że Twojej strony nie wolno osadzać w ramce.Dalej zwykle musisz doprecyzować:
script-src (najważniejsze): skąd wolno ładować JS oraz czy dopuszczasz inline.style-src: skąd wolno ładować CSS (tu często pojawia się problem inline styli).img-src: obrazy (często potrzebne data: dla SVG inline lub małych ikon, ale warto to przemyśleć).connect-src: połączenia XHR/fetch/WebSocket do analityki, API, pikseli.frame-src: jeśli osadzasz np. wideo, mapy, formularze zewnętrzne.W praktyce, jeśli masz dużo inline skryptów, kuszące jest dodanie 'unsafe-inline'. To działa, ale osłabia sens CSP. Lepsza droga to przejście na nonce/hashy. Nonce to losowy token generowany per odpowiedź HTML i dopinany do skryptów, które mają mieć prawo się wykonać. Hash to „odcisk” treści skryptu inline. Wymaga to pracy, ale daje realną ochronę.
Wdrożenie etapowe CSP bez bólu:
object-src 'none', ogranicz frame-src, dopilnuj base-uri.Strict-Transport-Security (HSTS) mówi przeglądarce: „od teraz łącz się z tą domeną tylko przez HTTPS”. To redukuje ryzyko ataków typu downgrade (przestawianie na HTTP), oraz ogranicza możliwość przechwycenia ruchu w niektórych scenariuszach sieciowych.
Przykładowy nagłówek:
Strict-Transport-Security: max-age=31536000
max-age to czas w sekundach, przez jaki przeglądarka ma pamiętać wymuszenie HTTPS. Często zaczyna się od krótszego okresu (np. tydzień), a potem wydłuża. Dwie opcje, które wyglądają niewinnie, ale wymagają żelaznej pewności:
includeSubDomains – obejmuje też subdomeny. Jeśli masz jakąkolwiek subdomenę, która nie działa na HTTPS, możesz sobie narobić problemów.preload – wpis na listę preload w przeglądarkach. To bardzo mocne i trudne do odkręcenia, więc wchodzi w grę dopiero, gdy masz pełną kontrolę nad domeną i subdomenami.Wersja „dojrzała”, gdy masz pewność co do całej domeny:
Strict-Transport-Security: max-age=31536000; includeSubDomains
HSTS jest szczególnie ważne, jeśli na stronie są formularze, logowanie, integracje płatności albo cokolwiek, co nie powinno „przypadkiem” polecieć po HTTP.
SRI to mechanizm po stronie HTML, który pozwala powiedzieć przeglądarce: „ten plik JS/CSS musi mieć dokładnie taką sumę kontrolną, inaczej go nie ładuj”. Chroni to przed scenariuszem, w którym zewnętrzny zasób (np. z CDN) zostaje podmieniony.
To nie jest nagłówek HTTP, tylko atrybuty w tagach i . Przykład (koncepcyjny):
Kiedy SRI ma największy sens?
Kiedy SRI może przeszkadzać?
Najlepsza praktyka: jeśli już korzystasz z CDN, korzystaj z konkretnych wersji bibliotek, a nie „pływających” odnośników. Dzięki temu SRI jest przewidywalne.
Clickjacking polega na tym, że atakujący osadza Twoją stronę w niewidocznej (lub sprytnie przyciętej) ramce i nakłada na nią własne elementy. Użytkownik myśli, że klika coś u atakującego, a w rzeczywistości klika przyciski na Twojej stronie. Na stronach marketingowych brzmi to abstrakcyjnie, ale jeśli masz jakiekolwiek formularze, potwierdzenia, akcje typu „wyślij”, „zamów”, „zapisz się”, to robi się realne.
Najlepsza ochrona to dyrektywa CSP:
Content-Security-Policy: frame-ancestors 'none'
Jeśli musisz pozwolić na osadzenie strony (np. landing w partnerskim portalu), możesz wpuścić konkretne domeny:
frame-ancestors 'self' https://partner.example
Dodatkowo istnieje starszy nagłówek:
X-Frame-Options: DENY albo SAMEORIGIN
W wielu wdrożeniach stosuje się oba: CSP jako główna kontrola i X-Frame-Options jako „backup” dla starszych przeglądarek. Najważniejsze: nie zostawiaj tego domyślnie otwartego, jeśli nie masz powodu.
Skoro już porządkujesz nagłówki, dorzucenie kilku kolejnych często daje szybkie korzyści małym kosztem:
X-Content-Type-Options: nosniff – utrudnia „zgadywanie” typu pliku przez przeglądarkę, co bywa wykorzystywane w atakach.Referrer-Policy – kontroluje, ile informacji o źródle żądania wysyłasz dalej (pomaga ograniczyć wycieki URL-i z parametrami).Permissions-Policy – pozwala ograniczyć dostęp do funkcji przeglądarki (np. kamera, mikrofon, geolokalizacja), jeśli Twoja strona ich nie potrzebuje.Uwaga praktyczna: nie chodzi o to, by włączyć „wszystko”, tylko by świadomie ograniczyć powierzchnię ataku. Jeśli Twoja strona nie korzysta z kamery i geolokalizacji, to po co pozostawiać te furtki otwarte.
Nagłówki możesz ustawić na kilka sposobów:
Najważniejsze: trzymaj jedną „prawdę”. Jeśli część nagłówków ustawisz w CMS, a część w CDN, łatwo o konflikt lub duplikaty. Ustal miejsce docelowe i pilnuj spójności. W praktyce często wygrywa CDN, bo ułatwia szybkie poprawki, a CSP/HSTS da się tam wdrażać stopniowo.
Po wdrożeniu nie kończysz pracy. Warto mieć prostą checklistę testów:
includeSubDomains w HSTS.Dobra praktyka dla CSP: zostaw sobie czas na „odchudzanie wyjątków”. Na początku prawie zawsze dopisujesz kilka domen „bo inaczej coś nie działa”. Potem warto wrócić i zdecydować: czy ta integracja jest naprawdę potrzebna, czy tylko „została po starych kampaniach”. CSP potrafi być świetnym narzędziem porządkującym marketingowy bałagan.
Jeśli masz zrobić tylko cztery rzeczy, zrób te:
'unsafe-inline' dla skryptów).preload, dopóki nie masz 100% pewności.frame-ancestors (i ewentualnie X-Frame-Options jako wsparcie).To nie są „fajerwerki dla korporacji”. To podstawy, które na zwykłej stronie firmowej potrafią zapobiec bardzo kosztownym problemom wizerunkowym.