Aktualna sytuacja: PHP2Shell. Dwie krytyczne luki w PHP (CVSS 9,2) umożliwiają wykonanie złośliwego kodu bez logowania. Poprawki od 21.10.2026.Co należy teraz zrobić →

Nagłówki bezpieczeństwa stron WWW: jak je prawidłowo ustawić

Nagłówki bezpieczeństwa każą przeglądarce lepiej chronić odwiedzających. Jak ustawić najważniejsze nagłówki w Nginx i Apache, wprowadzić Content-Security-Policy stopniowo i sprawdzić wynik.

Stan 5 min czytaniaPoradniki

Krótko: Nagłówki bezpieczeństwa to polecenia serwera WWW dla przeglądarki, które chronią odwiedzających przed atakami takimi jak cross-site scripting, clickjacking i połączenia nieszyfrowane. Najważniejsze to HSTS, Content-Security-Policy, X-Content-Type-Options, ochrona przed obcymi ramkami, Referrer-Policy i Permissions-Policy. Są sensownym utwardzeniem, ale nie zastępują aktualizacji na serwerze.

Co nagłówki bezpieczeństwa dają, a czego nie

Przy każdym wywołaniu strony serwer WWW wysyła obok treści także nagłówki. Część z nich steruje funkcjami bezpieczeństwa przeglądarki. Można w ten sposób ustalić na przykład, że strona jest ładowana tylko przez HTTPS lub że przeglądarka nie wykonuje skryptów z obcych domen.

Dla operatorów ważne jest właściwe zaklasyfikowanie: nagłówki chronią przede wszystkim odwiedzających, na przykład przed przechwytywaniem sesji lub zmanipulowanymi formularzami. Nie zamykają luk na serwerze. Podatność w PHP, w CMS lub w rozszerzeniu pozostaje, niezależnie od tego, jak dobrze ustawiono nagłówki. We współdziałaniu z czystym kodem wyraźnie ograniczają jednak skutki wielu błędów.

Najważniejsze nagłówki bezpieczeństwa w przeglądzie

Nagłówek Cel Zalecenie jako punkt wyjścia
Strict-Transport-Security (HSTS) wymusza HTTPS przy kolejnych wywołaniach max-age=31536000; includeSubDomains
Content-Security-Policy (CSP) określa dozwolone źródła skryptów, obrazów, ramek indywidualnie, najpierw jako Report-Only
X-Content-Type-Options zapobiega zgadywaniu typów plików przez przeglądarkę nosniff
X-Frame-Options lub CSP frame-ancestors zapobiega osadzaniu w obcych stronach (clickjacking) SAMEORIGIN lub frame-ancestors 'self'
Referrer-Policy ogranicza, jaki adres jest przekazywany innym stronom strict-origin-when-cross-origin
Permissions-Policy wyłącza funkcje przeglądarki, takie jak kamera czy lokalizacja zezwalać tylko na potrzebne funkcje

HSTS proszę ustawiać dopiero wtedy, gdy wszystkie subdomeny są niezawodnie dostępne przez HTTPS. Przeglądarka zapamiętuje polecenie na podany czas; błędu nie da się wtedy od razu cofnąć. Proszę ewentualnie zacząć od krótkiego czasu i zwiększyć go po udanych testach. Dodatkowa opcja preload wpisuje domenę trwale na listy producentów przeglądarek i powinna być ustawiana tylko po starannym sprawdzeniu.

Nagłówki nie są ponadto jedynym miejscem, w którym przeglądarka zapewnia ochronę. Ciasteczka powinny mieć atrybuty Secure, HttpOnly i SameSite, aby sesje nie były przechwytywane przez połączenia nieszyfrowane lub skrypty. Jak ustawić to w PHP, opisuje poradnik o sesjach.

Ustawianie nagłówków bezpieczeństwa w Nginx

W Nginx nagłówki należą do bloku server danej strony. Dodatek always sprawia, że są wysyłane także przy stronach błędów.

server {
    # ...
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
    add_header Content-Security-Policy-Report-Only "default-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'" always;

    server_tokens off;
}

Osobliwość Nginx: jeśli blok location ustawia własne dyrektywy add_header, nagłówki z bloku server nie są tam przejmowane. Proszę więc sprawdzić także podstrony i pliki statyczne. Dalsze utwardzanie dla tej kombinacji opisuje Zabezpieczanie Nginx z PHP-FPM.

Ustawianie nagłówków bezpieczeństwa w Apache

W Apache potrzebny jest moduł mod_headers. Dyrektywy należą do VirtualHost lub, jeśli nie ma do niego dostępu, do .htaccess.

<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
    Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'"
</IfModule>

ServerTokens Prod
ServerSignature Off

ServerTokens i ServerSignature należą do konfiguracji głównej. Zapobiegają temu, by serwer podawał swoją dokładną wersję w odpowiedziach i na stronach błędów. W php.ini to samo dla PHP osiągają Państwo przez expose_php = Off.

Stopniowe wprowadzanie Content-Security-Policy

Content-Security-Policy to najskuteczniejszy, ale i najbardziej wymagający nagłówek. Określa, z jakich źródeł można ładować skrypty, arkusze stylów, obrazy, czcionki i ramki. Jeśli wprowadzony skrypt jest doładowywany z obcej domeny, przeglądarka go blokuje.

Nowoczesne strony często osadzają narzędzia analityczne, dostawców płatności, usługi map lub filmy. Zbyt surowa polityka paraliżuje wtedy funkcje. Proszę więc działać etapami:

  • Zacząć najpierw od Content-Security-Policy-Report-Only. Przeglądarka zgłasza naruszenia w konsoli deweloperskiej lub na adres zbiorczy, ale niczego nie blokuje.
  • Ustalić wszystkie potrzebne źródła i celowo je dopuścić, zamiast stosować ogólne symbole wieloznaczne.
  • Stopniowo wydzielać skrypty inline do plików lub opatrywać je nonce, aby można było zrezygnować z 'unsafe-inline'.
  • Dopiero po fazie testowej bez nieoczekiwanych komunikatów przełączyć na Content-Security-Policy.
Wskazówka

CSP uzupełnia czyste escapowanie w kodzie, ale go nie zastępuje. Jak prawidłowo zabezpieczyć dane wyjściowe w PHP, opisuje poradnik Jak zapobiegać cross-site scripting w PHP.

Sprawdzanie nagłówków i unikanie typowych błędów

Po każdej zmianie powinni Państwo sprawdzić, czy nagłówki faktycznie docierają. Da się to zrobić bez dodatkowych narzędzi za pomocą curl:

# Przetestuj konfigurację i przeładuj
nginx -t && systemctl reload nginx

# Pokaż nagłówki strony głównej i pliku statycznego
curl -sI https://www.example.de/ | grep -iE 'strict|content-security|x-content|x-frame|referrer|permissions|server'
curl -sI https://www.example.de/favicon.ico | grep -iE 'strict|x-content'

Typowe błędy to podwójnie ustawione nagłówki, gdy serwer WWW i aplikacja wysyłają te same nagłówki, CDN stojący z przodu, który usuwa lub nadpisuje nagłówki, oraz nagłówki, które pojawiają się tylko na stronie głównej, ale nie przy przekierowaniach czy stronach błędów. Proszę sprawdzić ponadto po aktualizacjach CMS lub rozszerzeń bezpieczeństwa, czy nagłówki się nie zmieniły.

Proszę więc ustalić jedno miejsce, w którym nagłówki są utrzymywane, najlepiej serwer WWW lub usługa wstępna. Wiele rozszerzeń CMS oferuje również ustawienia nagłówków bezpieczeństwa. Jest to wygodne, ale łatwo prowadzi do podwójnych lub sprzecznych danych, jeśli dodatkowo nagłówki ustawia serwer. Do pojedynczych testów nadają się też narzędzia deweloperskie przeglądarki: w zakładce sieci widać dla każdego żądania nagłówki odpowiedzi, a konsola pokazuje naruszenia Content-Security-Policy.

Jak konkretnie pomaga PHP SOS?

  • Sprawdzamy aktualne nagłówki wszystkich Państwa stron, także za CDN i proxy, i wskazujemy luki oraz sprzeczności.
  • Ustawiamy nagłówki centralnie na serwerze WWW w ramach utwardzania serwera i testujemy stronę główną, podstrony i strony błędów.
  • Wprowadzamy Content-Security-Policy w trybie Report-Only, analizujemy komunikaty i po uzgodnieniu włączamy ją w trybie egzekwowania.
  • Tam, gdzie zmiany w kodzie nie są od razu możliwe, uzupełniamy ochronę o reguły WAF i wirtualne łatanie.

Częste pytania

Czym są nagłówki bezpieczeństwa (security headers)?

Nagłówki bezpieczeństwa to dodatkowe informacje w odpowiedzi serwera WWW. Mówią przeglądarce na przykład, że ma ładować stronę tylko przez HTTPS, nie wykonywać obcych skryptów albo nie wyświetlać strony w obcych ramkach. Chronią przede wszystkim odwiedzających.

Czy nagłówki bezpieczeństwa chronią przed PHP2Shell?

Nie. PHP2Shell to luka w PHP na serwerze, a nagłówki działają w przeglądarce odwiedzającego. Przeciw PHP2Shell pomaga aktualizacja do naprawionej wersji PHP i restart wszystkich procesów roboczych. Nagłówki to uzupełniające utwardzanie przeciw innym rodzajom ataków.

Czy Content-Security-Policy może zepsuć moją stronę?

Tak, zbyt surowa polityka blokuje potrzebne skrypty, czcionki lub osadzone treści. Dlatego wprowadza się ją najpierw w trybie Report-Only, analizuje komunikaty i dopiero potem przełącza na egzekwowanie.

Czy X-XSS-Protection nadal ma sens?

Nie. Aktualne przeglądarki nie analizują już tego nagłówka, a zalecenie brzmi: pominąć go lub ustawić na 0. Ochronę przed cross-site scriptingiem zapewniają czyste escapowanie w kodzie i Content-Security-Policy.

Źródła

Kontakt natychmiast

Liczy się każda godzina. Proszę napisać do nas teraz.

Proszę krótko opisać system, wersję PHP i obserwacje. Skontaktujemy się z Państwem, ustalimy sytuację i będziemy pracować zdalnie, aż incydent zostanie zamknięty i udokumentowany.

Natychmiastowa pomoc