Nagłówki bezpieczeństwa to nagłówki odpowiedzi HTTP, które mówią przeglądarkom, by aktywowały wbudowane funkcje bezpieczeństwa. Większości witryn WordPress domyślnie brakuje kilku z tych nagłówków, ponieważ ani rdzeń WordPressa, ani większość dostawców hostingu nie ustawia ich automatycznie. Dobra wiadomość jest taka, że dodanie ich zajmuje tylko kilka minut, a poprawa bezpieczeństwa jest znacząca. Ten przewodnik omawia każdy ważny nagłówek bezpieczeństwa, wyjaśnia, co robi, i pokazuje, jak dodać je wszystkie naraz.
Jakie nagłówki bezpieczeństwa powinna mieć każda witryna WordPress?
Oto pełna lista zalecanych nagłówków bezpieczeństwa z ich wartościami i przed czym chronią:
- X-Frame-Options: SAMEORIGIN: zapobiega ładowaniu Twojej strony w iframe na innej domenie. To zapobiega atakom clickjacking, gdzie złośliwa strona nakłada niewidoczne przyciski na Twoją stronę.
- X-Content-Type-Options: nosniff: zapobiega zgadywaniu przez przeglądarki typu MIME pliku. Bez tego atakujący mógłby wgrać plik, który wygląda jak obraz, ale zawiera JavaScript, a przeglądarka mogłaby go wykonać.
- Referrer-Policy: strict-origin-when-cross-origin: kontroluje, ile informacji URL jest udostępnianych, gdy użytkownicy klikają linki do innych stron. To ustawienie wysyła pełny URL dla żądań w tym samym origin, ale tylko domenę dla żądań cross-origin, co chroni wrażliwe parametry URL.
- Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(): wyłącza funkcje przeglądarki, których Twoja strona nie używa. Puste nawiasy oznaczają "nikt nie może używać tej funkcji", co zapobiega dostępowi złośliwych skryptów do kamery, mikrofonu lub lokalizacji.
- Strict-Transport-Security: max-age=31536000; includeSubDomains: wymusza, by przeglądarki zawsze używały HTTPS. Zobacz nasz dedykowany przewodnik HSTS dla szczegółów bezpiecznego wdrażania.
- X-XSS-Protection: 1; mode=block: legacy nagłówek dla starszych przeglądarek, który włącza wbudowany filtr XSS. Nowoczesne przeglądarki wycofały to na rzecz CSP, ale włączenie dla wstecznej kompatybilności nie zaszkodzi.
- Content-Security-Policy: najpotężniejszy (i najbardziej złożony) nagłówek bezpieczeństwa. Zobacz nasz dedykowany przewodnik CSP dla pełnego wyjaśnienia.
Jak priorytetyzować: które nagłówki dodać najpierw
Jeśli dodajesz nagłówki bezpieczeństwa po raz pierwszy, to kolejność, która da Ci największą poprawę bezpieczeństwa przy najmniejszym ryzyku:
- X-Content-Type-Options: zero ryzyka zepsucia czegokolwiek. Po prostu dodaj.
- X-Frame-Options: bezpieczne, chyba że celowo osadzasz swoją stronę w iframe na innych domenach (mało prawdopodobne dla większości witryn WordPress).
- Referrer-Policy: bardzo niskie ryzyko. Zalecana wartość
strict-origin-when-cross-originjest już domyślnym zachowaniem w nowoczesnych przeglądarkach. - Permissions-Policy: niskie ryzyko, chyba że Twoja strona faktycznie używa API kamery, mikrofonu lub geolokalizacji.
- X-XSS-Protection: legacy nagłówek, brak ryzyka.
- Strict-Transport-Security: wymaga najpierw działającego HTTPS. Postępuj według stopniowego wdrażania (zobacz nasz przewodnik HSTS).
- Content-Security-Policy: największe ryzyko zepsucia rzeczy w WordPressie. Zawsze zaczynaj w trybie Report-Only (zobacz nasz przewodnik CSP).
Dodawanie wszystkich nagłówków przez Apache .htaccess
To najczęstsza metoda dla witryn WordPress na hostingu współdzielonym. Otwórz plik .htaccess w katalogu głównym WordPressa i dodaj następujący blok. Umieść go przed sekcją # BEGIN WordPress, by zachować porządek:
<IfModule mod_headers.c>
# Prevent clickjacking
Header always set X-Frame-Options "SAMEORIGIN"
# Prevent MIME-type sniffing
Header always set X-Content-Type-Options "nosniff"
# Control referrer information
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Restrict browser features
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()"
# Force HTTPS (only add if SSL is fully working)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# XSS Protection for legacy browsers
Header always set X-XSS-Protection "1; mode=block"
</IfModule>Kilka rzeczy do zapamiętania:
- Wrapper
IfModulezapewnia, że Apache nie da błędu 500, jeślimod_headersnie jest włączony na Twoim serwerze. - Użycie
Header always set(zamiast tylkoHeader set) zapewnia, że nagłówki są wysyłane przy wszystkich odpowiedziach, w tym przy stronach błędów. - Jeśli masz już blok
<IfModule mod_headers.c>w swoim.htaccess, dodaj poszczególne linieHeaderwewnątrz istniejącego bloku, zamiast tworzyć duplikat.
Dodawanie wszystkich nagłówków przez Nginx
Jeśli Twoja witryna WordPress działa na Nginx (powszechne u zarządzanych hostów WordPress, takich jak Kinsta, Cloudways, GridPane lub SpinupWP), dodaj te linie wewnątrz bloku server:
# Security Headers
add_header X-Frame-Options "SAMEORIGIN" 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=(), payment=()" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-XSS-Protection "1; mode=block" always;Ważne kwestie specyficzne dla Nginx:
- Słowo kluczowe
alwayswysyła nagłówek przy wszystkich kodach odpowiedzi (w tym 4xx i 5xx). Bez tego Nginx wysyła nagłówki tylko przy odpowiedziach 2xx. - Jeśli masz osobny blok
locationobsługujący PHP (np.location ~ .php$), być może będziesz musiał dodać tam też nagłówki, w zależności od konfiguracji Nginx. Nginx nie dziedziczy dyrektywadd_headerz bloków nadrzędnych, jeśli blok podrzędny ma własneadd_header. - Zawsze testuj i przeładuj po zmianach:
sudo nginx -t && sudo systemctl reload nginx.
Dodawanie nagłówków przez PHP w WordPressie
Jeśli nie masz dostępu do plików konfiguracyjnych serwera, możesz wysyłać nagłówki bezpieczeństwa z PHP. Dodaj to do functions.php swojego motywu lub do niestandardowej wtyczki specyficznej dla witryny:
function iwp_add_security_headers() {
if ( is_admin() ) {
return;
}
header( 'X-Frame-Options: SAMEORIGIN' );
header( 'X-Content-Type-Options: nosniff' );
header( 'Referrer-Policy: strict-origin-when-cross-origin' );
header( 'Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()' );
header( 'X-XSS-Protection: 1; mode=block' );
}
add_action( 'send_headers', 'iwp_add_security_headers' );Sprawdzenie is_admin() pomija obszar administracyjny WordPress, by uniknąć potencjalnych konfliktów z funkcjonalnością admina. Pamiętaj, że to podejście PHP ma ograniczenie: dotyczy tylko stron przetwarzanych przez WordPress. Pliki statyczne (obrazy, CSS, JS, fonty) serwowane bezpośrednio przez serwer WWW nie noszą tych nagłówków. Dla pełnego pokrycia konfiguracja na poziomie serwera jest zawsze lepszym wyborem.
Wtyczki WordPress do nagłówków bezpieczeństwa
Jeśli wolisz podejście wtyczkowe, te opcje oferują przyjazny interfejs do zarządzania nagłówkami bezpieczeństwa:
- HTTP Headers: bezpłatna wtyczka z rozbudowanym UI do ustawiania wszystkich nagłówków bezpieczeństwa. Wspiera X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy i więcej. Konfigurujesz wszystko z obszaru administracyjnego WordPress bez dotykania plików.
- Really Simple SSL Pro: wersja premium zawiera moduł nagłówków bezpieczeństwa, gdzie możesz włączać lub wyłączać poszczególne nagłówki. Daje też rekomendacje i wyjaśnia każdy nagłówek.
- Headers Security Advanced & HSTS WP: ukierunkowana wtyczka specjalnie dla nagłówków bezpieczeństwa. Pokrywa wszystkie ważne nagłówki i zawiera presety dla typowych konfiguracji.
- Security Headers od Jeremykendall: lekka opcja, która dodaje wszystkie zalecane nagłówki z rozsądnymi domyślnymi wartościami.
Choć wtyczki są wygodne, mają wady. Jeśli wtyczka zostanie dezaktywowana, zaktualizowana z błędem lub usunięta, Twoje nagłówki bezpieczeństwa natychmiast znikają. Dla witryn produkcyjnych konfiguracja na poziomie serwera jest bardziej niezawodna, ponieważ nie zależy od WordPressa ani aktywnej wtyczki.
Testowanie nagłówków z narzędziami online
Po dodaniu zweryfikuj nagłówki tymi bezpłatnymi narzędziami:
- securityheaders.com: wprowadź swój URL i otrzymaj ocenę od A+ do F wraz ze szczegółowym przeglądem, które nagłówki są obecne, a których brakuje. Dąż co najmniej do oceny A.
- observatory.mozilla.org: narzędzie Mozilla wykonuje bardziej rozbudowaną analizę, w tym ocenę CSP i bezpieczeństwa ciasteczek.
- DevTools przeglądarki: naciśnij F12, przejdź do zakładki Network, kliknij żądanie głównego dokumentu i przewiń do Response Headers, by dokładnie zobaczyć, co wysyła Twój serwer.
Możesz też sprawdzić z linii poleceń:
curl -sI https://example.comPokazuje to wszystkie nagłówki odpowiedzi, w tym Twoje nowo dodane nagłówki bezpieczeństwa.
Kwestie CDN i reverse proxy
Jeśli Twoja witryna WordPress jest za CDN takim jak Cloudflare, Sucuri lub Fastly, pamiętaj, że CDN może usuwać nagłówki, nadpisywać je lub dodawać własne. Oto co musisz wiedzieć:
- Cloudflare: domyślnie nie usuwa nagłówków bezpieczeństwa, więc nagłówki ustawione na Twoim serwerze origin są przekazywane. Cloudflare oferuje też własne ustawienia nagłówków bezpieczeństwa w dashboardzie pod SSL/TLS > Edge Certificates (dla HSTS) i w managed rules.
- Sucuri: ich firewall może automatycznie dodawać niektóre nagłówki bezpieczeństwa. Sprawdź ustawienia w dashboardzie Sucuri, by zobaczyć, które są aktywne, i uniknąć duplikatów.
- Fastly / KeyCDN / BunnyCDN: większość CDN pozwala dodawać niestandardowe nagłówki odpowiedzi w panelu konfiguracji. Może to być dobra alternatywa, jeśli nie możesz zmienić konfiguracji serwera origin.
Jeśli widzisz zduplikowane nagłówki w swojej odpowiedzi (np. dwie linie X-Frame-Options), może to spowodować nieprzewidywalne zachowanie przeglądarki. Upewnij się, że każdy nagłówek jest ustawiony tylko w jednym miejscu: albo na serwerze origin, albo na poziomie CDN, nie obu.
Typowe błędy przy dodawaniu nagłówków bezpieczeństwa
- Zduplikowane bloki IfModule: jeśli Twój
.htaccessma już blok<IfModule mod_headers.c>(być może z wtyczki), dodanie drugiego może powodować konflikty. Połącz nagłówki w istniejącym bloku. - Ustawianie nagłówków tylko przez PHP: omija to wszystkie pliki statyczne. Użyj konfiguracji na poziomie serwera dla pełnego pokrycia.
- Nadpisywanie nagłówków w blokach location (Nginx): jeśli blok
locationpotomny ma choćby jedenadd_header, zastępuje wszystkie nagłówki z bloku nadrzędnego. Musisz powtórzyć wszystkie nagłówki w każdym bloku location, który definiuje własne. - Brak testowania po aktualizacjach wtyczek: aktualizacja wtyczki lub zmiana motywu może usunąć Twoje nagłówki oparte na PHP. Zawsze testuj ponownie po dużych zmianach.
- Zapominanie o subdomenach: jeśli masz subdomeny (staging, mail itp.), upewnij się, że one też mają skonfigurowane nagłówki bezpieczeństwa. Atakujący często celują w najsłabszą subdomenę.
Zweryfikuj swoje nagłówki bezpieczeństwa z InspectWP
Po dodaniu wszystkich nagłówków wykonaj nowy skan InspectWP na swojej witrynie WordPress. Sekcja bezpieczeństwa Twojego raportu wymienia każdy nagłówek bezpieczeństwa i pokazuje status. Każdy nagłówek, który jest obecny i poprawnie skonfigurowany, pojawia się jako zielony. Brakujące nagłówki pojawiają się jako czerwone lub żółte, w zależności od ich ważności. Użyj funkcji automatycznych raportów InspectWP, by monitorować swoje nagłówki w czasie i wykryć regresje spowodowane zmianami serwera lub aktualizacjami wtyczek.