Jak działa ta kontrola
Scanaris pobiera Twoją stronę główną tak jak przeglądarka i czyta nagłówki odpowiedzi. Szuka sześciu konkretnych nagłówków i dla każdego brakującego otwiera znalezisko z zalecaną wartością: Content-Security-Policy, Strict-Transport-Security i X-Frame-Options ze średnią wagą oraz X-Content-Type-Options, Referrer-Policy i Permissions-Policy z niską. Nie ocenia tu jakości CSP ani HSTS: tym zajmują się kontrole słabe CSP i słabe HSTS. Sprawdzana jest tylko odpowiedź skanowanego URL-a, więc jeśli Twoje API żyje na innej domenie, przeskanuj ją osobno.
Co chroni każdy nagłówek
- Content-Security-Policy ogranicza, skąd mogą być ładowane skrypty, style i obrazy. To główna obrona przed wstrzykiwaniem skryptów (XSS).
- Strict-Transport-Security zmusza przeglądarkę do zawsze używania HTTPS z Twoją domeną, nawet jeśli ktoś wpisze adres bez „s".
- X-Frame-Options uniemożliwia osadzenie Twojej strony w cudzym iframe, co jest podstawą clickjackingu.
- X-Content-Type-Options: nosniff zapobiega „zgadywaniu" typu pliku przez przeglądarkę i wykonywaniu jako skrypt czegoś, co nim nie było.
- Referrer-Policy kontroluje, jaka część URL-a trafia do innych stron, gdy użytkownik klika link.
- Permissions-Policy wyłącza API przeglądarki, których nie używasz, jak kamera, mikrofon czy geolokalizacja.
Jak je dodać w zależności od hostingu
Vercel
W vercel.json albo w next.config funkcją headers(), jeśli używasz Next.js:
{
"headers": [
{
"source": "/(.*)",
"headers": [
{ "key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains; preload" },
{ "key": "X-Frame-Options", "value": "DENY" },
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" },
{ "key": "Permissions-Policy", "value": "camera=(), microphone=(), geolocation=()" }
]
}
]
}
Netlify
Plik _headers w publikowanym katalogu:
/*
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Nuxt
W nuxt.config, wewnątrz routeRules, reguła '/**' z obiektem headers i tymi samymi parami klucz-wartość. Dokładnie tak robi Scanaris.
Express
import helmet from 'helmet';
app.use(helmet());
nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
Content-Security-Policy celowo nie ma w przykładach: zależy od tego, jakie skrypty i usługi ładuje Twoja strona, i najlepiej zacząć ją w trybie raportowania. Procedura jest w nagłówki bezpieczeństwa HTTP wyjaśnione dla ludzi.
Sprawdź, czy są
curl -sI https://twojadomena.com | grep -iE "strict-transport|x-frame|x-content-type|referrer-policy|permissions-policy|content-security"
Powinno pojawić się sześć linii. Jeśli masz CDN przed serwerem, sprawdzaj na publicznym URL-u, bo niektóre CDN-y usuwają lub nadpisują nagłówki. Analizator nagłówków robi ten sam odczyt z wyjaśnieniem dla każdego nagłówka.
Często zadawane pytania
X-Frame-Options czy frame-ancestors?
Oba robią to samo; frame-ancestors w CSP to nowoczesna wersja i pozwala wymienić konkretne domeny. Zostaw też X-Frame-Options dla starszych przeglądarek; nie przeszkadzają sobie.
Czy dodając te nagłówki mogę zepsuć stronę?
Pięć z przykładów nie psuje niczego na normalnej stronie. Jedyny ryzykowny to CSP, dlatego dodaje się go najpierw w trybie Content-Security-Policy-Report-Only i przełącza na blokowanie, gdy raporty są czyste.
Czy w HSTS potrzebne jest preload?
Nie, żeby przejść kontrolę. preload pozwala umieścić Twoją domenę na liście wbudowanej w przeglądarki; to zobowiązanie na długo (cała domena i subdomeny na HTTPS na zawsze), więc włącz je tylko, gdy masz pewność.