Jak działa ta kontrola
Ta kontrola działa tylko wtedy, gdy Twoja strona już wysyła nagłówek Strict-Transport-Security; jeśli brakuje go całkowicie, zgłasza to skaner nagłówków. Scanaris odczytuje wartość i sprawdza dwie rzeczy: czy max-age wynosi co najmniej rok (31536000 sekund) i czy zawiera includeSubDomains. Jeśli brakuje jednego z nich, otwiera ustalenie o niskiej wadze ze szczegółami. Niskiej, bo krótki lub częściowy HSTS wciąż coś chroni; ale zostawia luki, które atakujący może wykorzystać.
Co robi HSTS i dlaczego oba atrybuty
Gdy przeglądarka otrzyma ten nagłówek przez HTTPS, zapisuje Twoją domenę na wewnętrznej liście i przez czas wskazany w max-age zamienia każdą próbę wejścia na http:// w https://, zanim cokolwiek wyśle. To eliminuje pierwsze niezaszyfrowane żądanie, którego przekierowanie nie jest w stanie uniknąć. max-age rzędu kilku godzin lub dni zostawia użytkownika bez ochrony przy każdym wygaśnięciu; stąd minimum jednego roku. Bez includeSubDomains atakujący może wycelować w cokolwiek.twojadomena.pl przez HTTP i, przez sposób działania ciasteczek domenowych, ukraść lub ustawić ciasteczka ważne dla strony głównej.
Jak to naprawić
Zalecana wartość:
Strict-Transport-Security: max-age=31536000; includeSubDomains
- Vercel: ustawia go domyślnie na domenach własnych; jeśli używasz
vercel.jsonlubnext.configdo innych nagłówków, dodaj go tam z tą wartością. - Netlify: w pliku
_headers, pod/*. - Nuxt: w
routeRuleswnuxt.config, reguła'/**'. - nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;w blokuserverdla 443. - Express:
helmet.hsts({ maxAge: 31536000, includeSubDomains: true }).
Zanim dodasz includeSubDomains, upewnij się, że wszystkie Twoje subdomeny serwują HTTPS: panel administracyjny, API, blog u innego dostawcy, subdomena pocztowa, jeśli ma stronę. Każda subdomena odpowiadająca tylko przez HTTP przestanie działać w przeglądarkach, które już widziały nagłówek, i nie ma drogi powrotu, dopóki max-age nie wygaśnie. W razie wątpliwości zacznij od max-age=86400 i bez subdomen, sprawdź, a potem podnieś wartość, gdy wszystko działa.
Preload
Z preload i max-age co najmniej jednego roku możesz wnioskować o dodanie domeny do listy wbudowanej w Chrome, Firefox i Safari: wtedy nawet pierwsza wizyta nie przechodzi przez HTTP. To zwykła różnica między oceną A i A+ w narzędziach analitycznych. Ale to zobowiązanie prawie nieodwracalne (wyjście z listy zajmuje miesiące), więc zrób to tylko wtedy, gdy cała domena działa na HTTPS od jakiegoś czasu bez incydentów.
Sprawdź, czy naprawione
curl -sI https://twojadomena.pl | grep -i strict-transport
Musi pokazać max-age równe 31536000 lub więcej oraz includeSubDomains. Sprawdź na publicznym adresie: jeśli masz przed sobą CDN, to on musi go wysyłać.
Często zadawane pytania
Czy HSTS zastępuje przekierowanie z HTTP na HTTPS?
Nie. Nagłówek dociera tylko przez HTTPS, więc pierwsza wizyta nadal potrzebuje przekierowania. Uzupełniają się: przekierowanie za pierwszym razem, HSTS przy wszystkich kolejnych.
Mam wewnętrzną subdomenę, która działa tylko przez HTTP.
W takim razie nie dodawaj includeSubDomains, dopóki jej nie zmigrujesz, i zaakceptuj na razie ustalenie o niskiej wadze. Niezaszyfrowana subdomena to realne ryzyko dla ciasteczek domeny, więc migracja się opłaca.
Co się stanie, jeśli skonfiguruję to źle?
Przeglądarki, które otrzymały nagłówek, zachowają politykę do jej wygaśnięcia. Możesz wysłać max-age=0, żeby poprosić je o zapomnienie, ale zobaczą to tylko te, które wrócą przez HTTPS. Dlatego lepiej zaczynać od krótkich wartości.