ShieldWave

Wszystkie artykuły

Nagłówki bezpieczeństwa: co to jest i co zlecić programiście

Sześć nagłówków HTTP, które mówią przeglądarce, jak chronić ludzi na Twojej stronie. Co robi każdy z nich, jak je sprawdzić i gotowe zlecenie dla programisty.

Radek, ENSOMEDIAOpublikowano 4 min czytaniaIn English

Gdy ktoś otwiera Twoją stronę, serwer wysyła jego przeglądarce treść, a razem z nią kilka linijek instrukcji, których odwiedzający nie widzi. To nagłówki HTTP. Część z nich mówi przeglądarce, jak ma chronić ludzi na Twojej stronie, na przykład żeby łączyła się z nią wyłącznie przez szyfrowane połączenie albo żeby nie uruchamiała skryptów z nieznanych adresów.

Nagłówki nic nie kosztują i ustawia się je raz. Mimo to na wielu stronach ich brakuje, bo domyślna konfiguracja serwera często ich nie dodaje. Jeśli test bezpieczeństwa pokazał Ci „brak nagłówków bezpieczeństwa”, poniżej wyjaśniam, co to znaczy, i daję gotowy tekst do przesłania programiście.

Jak sprawdzić, co wysyła Twoja strona

Najszybciej w samej przeglądarce. W Chrome, Edge albo Firefoksie otwórz swoją stronę i naciśnij F12 (na Macu Cmd+Option+I). Otworzy się panel narzędzi dla programistów. Wybierz zakładkę Network (w polskiej wersji może się nazywać Sieć) i odśwież stronę. Na górze listy pojawi się pozycja z adresem Twojej strony. Kliknij ją i znajdź sekcję Response Headers, czyli nagłówki odpowiedzi.

Resztą panelu się nie przejmuj. Szukasz tylko nazw opisanych niżej.

Drugi sposób to darmowy tester nagłówków, na przykład nasz test nagłówków bezpieczeństwa albo HTTP Observatory prowadzone przez Mozillę na stronie MDN. Wpisujesz adres i dostajesz listę nagłówków z oceną. Traktuj ją jako wskazówkę, a nie wyrok.

Strict-Transport-Security: zawsze przez HTTPS

Ten nagłówek, w skrócie HSTS, mówi przeglądarce: przez najbliższy czas łącz się z tą domeną wyłącznie przez HTTPS. Chroni odwiedzających na przykład w publicznym Wi-Fi, gdzie ktoś mógłby próbować przechwycić pierwsze, nieszyfrowane połączenie.

Strict-Transport-Security: max-age=31536000; includeSubDomains

max-age to czas w sekundach, tutaj rok. I tu jest pułapka. Gdy przeglądarka zapamięta ten nagłówek, przy problemie z certyfikatem odwiedzający nie może już ominąć ostrzeżenia i wejść mimo to. A includeSubDomains obejmuje wszystkie subdomeny, więc jeśli sklep.twojadomena.pl albo zapomniany test.twojadomena.pl nie mają działającego HTTPS, przestaną się otwierać.

Dlatego zaczyna się od krótkiego czasu, na przykład jednego dnia, i wydłuża go, gdy wszystko działa. Dopisku preload nie dodawaj bez namysłu, bo bardzo trudno go potem wycofać.

Content-Security-Policy: lista zaufanych źródeł

To najmocniejszy z nagłówków i jedyny, który naprawdę potrafi zepsuć stronę. CSP to lista miejsc, z których strona może wczytywać skrypty, style, obrazy czy czcionki. Jeśli włamywaczowi uda się wstrzyknąć na stronę złośliwy skrypt, na przykład przez dziurawy formularz, przeglądarka odmówi uruchomienia kodu z adresu spoza listy.

Kłopot w tym, że typowa strona małej firmy korzysta z wielu zewnętrznych usług: Google Analytics albo Tag Managera, piksela Facebooka, okienka czatu, mapy, czcionek, filmów z YouTube, bramki płatności. Wystarczy pominąć jedną z nich i ta część strony przestaje działać. Znika czat albo nie da się zapłacić.

Dlatego CSP zaczyna się w trybie próbnym, pod nazwą Content-Security-Policy-Report-Only. W tym trybie przeglądarka niczego nie blokuje, tylko zgłasza, co by zablokowała. Programista zbiera te zgłoszenia przez tydzień lub dwa zwykłego ruchu, uzupełnia listę i dopiero wtedy przełącza nagłówek na tryb blokujący. Przykład, jak to może wyglądać:

Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://www.googletagmanager.com; img-src 'self' data: https:

To tylko ilustracja, prawdziwa lista zależy od tego, z czego korzysta Twoja strona. Na stronach z dużą liczbą wtyczek pełne CSP bywa trudne do ustawienia. Nawet wtedy częściowa polityka jest lepsza niż żadna.

Cztery krótsze nagłówki

X-Content-Type-Options: nosniff każe przeglądarce wierzyć w typ pliku podany przez serwer, zamiast zgadywać. Bez niego plik wgrany jako tekst albo obrazek mógłby w pewnych sytuacjach zostać potraktowany jak skrypt. Rzadko cokolwiek psuje, o ile serwer poprawnie podaje typy plików.

X-Frame-Options: SAMEORIGIN zabrania innym stronom wyświetlania Twojej w ramce. Chroni przed tak zwanym clickjackingiem: ktoś osadza Twoją stronę niewidocznie pod własną i nakłania odwiedzającego do kliknięcia w coś, czego ten nie widzi, na przykład w przycisk zamówienia. Nowszym odpowiednikiem jest frame-ancestors 'self' w CSP i można ustawić oba. Jeśli Twoja strona celowo wyświetla się w ramce gdzie indziej, na przykład kalendarz rezerwacji na stronie partnera, programista musi dopisać adres partnera do frame-ancestors.

Referrer-Policy: strict-origin-when-cross-origin sprawia, że gdy ktoś kliknie u Ciebie link do innej strony, tamta strona dowie się tylko, z jakiej domeny przyszedł, a nie z której podstrony. Ma to znaczenie, gdy adresy podstron zawierają coś prywatnego, na przykład numer zamówienia. Współczesne przeglądarki działają tak domyślnie, ale ustawienie nagłówka wprost nic nie kosztuje.

Permissions-Policy: camera=(), microphone=(), geolocation=() ogłasza, że Twoja strona nie korzysta z kamery, mikrofonu ani lokalizacji. Nawet wstrzyknięty skrypt nie poprosi wtedy odwiedzającego o dostęp do nich. Jeśli masz na stronie wyszukiwarkę najbliższego punktu albo konsultacje wideo, programista zostawi potrzebną funkcję włączoną.

Gotowe zlecenie dla programisty

Możesz skopiować poniższy tekst i wysłać go w całości, podmieniając adres.

Proszę o dodanie nagłówków bezpieczeństwa na twojadomena.pl,
na wszystkich podstronach, także w panelu i sklepie:

Strict-Transport-Security: max-age=86400; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Content-Security-Policy-Report-Only: polityka dopasowana
  do skryptów i usług, z których faktycznie korzystamy

Przed włączeniem includeSubDomains proszę sprawdzić, czy
wszystkie subdomeny działają po HTTPS. Jeśli przez tydzień
nic się nie zepsuje, proszę podnieść max-age do 31536000.

CSP najpierw tylko w trybie Report-Only, przez tydzień
lub dwa. Potem proszę o listę zgłoszonych naruszeń
i razem ustalmy przejście na tryb blokujący.

Proszę też o informację, gdzie nagłówki zostały ustawione
(serwer, .htaccess, Cloudflare czy wtyczka).

Ostatnia prośba ma znaczenie. Nagłówki da się ustawić w kilku miejscach naraz, a dwa różne ustawienia tego samego nagłówka to prosta droga do zamieszania przy następnej zmianie. Po wdrożeniu sprawdź nagłówki jeszcze raz i przeklikaj najważniejsze miejsca: formularz, koszyk, płatność, czat, mapę i logowanie do panelu.

Czego nagłówki nie załatwią

Nagłówki to druga linia obrony. Nie naprawią nieaktualnej wtyczki ani słabego hasła. Ograniczają skutki, gdy coś innego zawiedzie.

Nie goń też za najwyższą oceną w testerze za wszelką cenę. Strona z pięcioma prostymi nagłówkami i działającą płatnością jest w dużo lepszej sytuacji niż strona z idealnym CSP, przez które klienci nie mogą złożyć zamówienia.

I jeszcze jedno: jeśli jakieś narzędzie każe Ci dodać nagłówek X-XSS-Protection, nie traktuj tego jako pilnego. Większość współczesnych przeglądarek go ignoruje, a aktualne zalecenia mówią, żeby go nie używać albo ustawić na 0.