Dokumentacja
Ukryj wersje oprogramowania
Ukryj wersje oprogramowania
Wiele serwerów dokładnie ogłasza, na czym działa: Server: nginx/1.18.0 (Ubuntu), X-Powered-By: PHP/7.4.33 albo znacznik <meta name="generator" content="WordPress 6.1.1"> na stronie. Sam numer wersji nic nie daje Twoim odwiedzającym. Dla atakującego to skrót: mówi, które znane podatności wypróbować najpierw, a automatyczne skanery szukają właśnie tych ciągów.
Ukrycie wersji nie naprawia starej wersji, więc nadal aktualizuj. Ale nie ma powodu, by ją ogłaszać, a lista kontrolna strony oznacza ją jako coś do sprawdzenia.
Gdzie pojawiają się wersje
| Gdzie | Przykład | Kto ją dodaje |
|---|---|---|
nagłówek Server |
nginx/1.18.0 (Ubuntu), Apache/2.4.41 (Ubuntu) |
serwer WWW |
nagłówek X-Powered-By |
PHP/8.3.35, Express, ASP.NET |
PHP, Node.js lub IIS |
<meta name="generator"> w HTML |
WordPress 6.4.2, WPML ver:4.6.9, Elementor 3.18.0, WooCommerce 8.5 |
CMS i jego wtyczki |
Lista kontrolna pokazuje, które z nich znalazła. Nagłówek, który mówi tylko nginx lub Apache, bez numeru, jest w porządku.
Sprawdź sam
Zamiast example.com wpisz swoją stronę:
curl -sI https://example.com | grep -iE '^(server|x-powered-by):'
curl -s https://example.com | grep -io '<meta name="generator"[^>]*>'
Pierwsze polecenie wypisuje nagłówki, drugie znaczniki generator. Jeśli oba nic nie wypisują albo tylko nazwę bez wersji, gotowe.
Jak to naprawić
Wybierz to, do czego masz dostęp. Większość stron potrzebuje dwóch poprawek: jednej dla nagłówków (serwer lub panel hostingu) i jednej dla znaczników generator (CMS). Jeśli masz tylko dostęp do panelu WordPressa, zakładka WordPress obejmuje oba, na ile pozwala WordPress.
WordPress
WordPress wypisuje własną wersję, a wiele wtyczek dodaje swoje (WPML, Elementor, WooCommerce, Slider Revolution, Yoast w komentarzach). Zamiast usuwać je po kolei, usuń wszystkie znaczniki generator naraz.
Dodaj to za pomocą darmowej wtyczki Code Snippets (Snippets → Add New, uruchamiaj wszędzie) albo na końcu pliku functions.php motywu potomnego (child theme). Nie umieszczaj tego w motywie nadrzędnym: aktualizacja by to nadpisała.
// Bez wersji WordPressa na stronie i w kanałach RSS.
remove_action('wp_head', 'wp_generator');
add_filter('the_generator', '__return_empty_string');
// Wszystkie pozostałe znaczniki <meta name="generator"> (WPML, Elementor, WooCommerce …).
add_action('template_redirect', function () {
ob_start(fn ($html) => preg_replace('/<meta\s+name=["\']generator["\'][^>]*>\s*/i', '', $html));
});
// Nagłówek z wersją PHP, gdy wysyła go sam PHP.
add_action('send_headers', fn () => header_remove('X-Powered-By'));
Potem wyczyść pamięć podręczną stron (WP Rocket, LiteSpeed Cache, W3 Total Cache, cache hostingu): strona z pamięci podręcznej nadal zawiera stare znaczniki.
Nagłówek Server ustawia serwer WWW, nie WordPress. Do niego użyj zakładki swojego panelu hostingu lub serwera.
cPanel
Wersja PHP (X-Powered-By):
- Otwórz Software → MultiPHP INI Editor.
- Przełącz na Editor Mode i wybierz domenę.
- Dodaj lub zmień wiersz
expose_php = Offi kliknij Save.
Jeśli nagłówek nadal jest obecny, dodaj to do pliku .htaccess w głównym folderze strony (File Manager, z włączonym Show Hidden Files):
<IfModule mod_headers.c>
Header always unset X-Powered-By
Header unset X-Powered-By
</IfModule>
Wersja serwera WWW (Server): na współdzielonym hostingu z cPanelem konfiguracja serwera należy do dostawcy. Większość dostawców już wysyła tylko Apache lub LiteSpeed. Jeśli Twój pokazuje wersję, poproś pomoc techniczną o ustawienie ServerTokens Prod; to dla nich zmiana jednego wiersza.
Znaczniki generator pochodzą z CMS-a: zobacz zakładkę WordPress.
Plesk
Wersja PHP (X-Powered-By): Websites & Domains → example.com → PHP Settings, w Additional configuration directives dodaj:
expose_php = Off
Wersja nginx i pozostałe nagłówki: Websites & Domains → example.com → Apache & nginx Settings, w Additional nginx directives dodaj:
server_tokens off;
fastcgi_hide_header X-Powered-By;
proxy_hide_header X-Powered-By;
Kliknij OK; Plesk sprawdzi składnię i przeładuje nginx.
Znaczniki generator pochodzą z CMS-a: zobacz zakładkę WordPress.
nginx
Wersja serwera: w /etc/nginx/nginx.conf, wewnątrz bloku http { … }:
http {
server_tokens off;
# PHP-FPM i aplikacje za proxy (Node, Python) mogą wysyłać X-Powered-By.
fastcgi_hide_header X-Powered-By;
proxy_hide_header X-Powered-By;
}
Wersja PHP: znajdź php.ini, którego używa PHP-FPM. Wiersz poleceń używa innego pliku, więc php --ini wskazuje niewłaściwy. Na Debianie i Ubuntu to /etc/php/8.3/fpm/php.ini (Twój numer wersji może być inny). Ustaw:
expose_php = Off
Przetestuj i zastosuj oba:
sudo nginx -t && sudo systemctl reload nginx
sudo systemctl restart php8.3-fpm
Znaczniki generator pochodzą z CMS-a: zobacz zakładkę WordPress.
Apache i LiteSpeed
Z dostępem do serwera (Apache). Na Debianie i Ubuntu edytuj /etc/apache2/conf-available/security.conf, na Rocky, Alma i CentOS /etc/httpd/conf/httpd.conf:
ServerTokens Prod
ServerSignature Off
Następnie usuń nagłówek PHP (wymaga mod_headers, na Debianie i Ubuntu: sudo a2enmod headers):
Header always unset X-Powered-By
Zastosuj zmiany:
sudo apachectl configtest && sudo systemctl reload apache2
(Na Rocky, Alma i CentOS httpd zamiast apache2.)
Bez dostępu do serwera (hosting współdzielony, LiteSpeed). LiteSpeed czyta .htaccess tak jak Apache i zwykle nie pokazuje wersji w Server. Aby usunąć nagłówek PHP, dodaj to do .htaccess w katalogu głównym strony:
<IfModule mod_headers.c>
Header always unset X-Powered-By
Header unset X-Powered-By
</IfModule>
Ustaw też expose_php = Off w ustawieniach PHP u dostawcy hostingu, jeśli panel je ma.
Znaczniki generator pochodzą z CMS-a: zobacz zakładkę WordPress.
Cloudflare
Jeśli strona działa za Cloudflare (pomarańczowa chmurka), Cloudflare już zastępuje nagłówek Server wartością cloudflare. X-Powered-By z serwera źródłowego nadal jednak przechodzi. Usuniesz go także w darmowym planie:
- Otwórz domenę w Cloudflare i przejdź do Rules → Transform Rules → Modify Response Header.
- Create rule, nazwij ją Remove X-Powered-By i zastosuj do All incoming requests.
- W Modify response header wybierz Remove, nazwa nagłówka
X-Powered-By, i kliknij Deploy.
Znaczniki generator są częścią HTML i Cloudflare ich nie rusza: zobacz zakładkę WordPress.
Node.js i Next.js
Express wysyła X-Powered-By: Express, dopóki tego nie wyłączysz:
const app = express();
app.disable('x-powered-by');
Next.js wysyła X-Powered-By: Next.js. W next.config.js:
module.exports = {
poweredByHeader: false,
};
Jeśli przed aplikacją stoi nginx, proxy_hide_header X-Powered-By; wyłapie tam wszystko, co aplikacja nadal wysyła (zobacz zakładkę nginx).
IIS i ASP.NET
W pliku web.config strony:
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
<security>
<!-- IIS 10 w wersji 1709 i nowszych: brak nagłówka Server. -->
<requestFiltering removeServerHeader="true" />
</security>
</system.webServer>
<system.web>
<httpRuntime enableVersionHeader="false" />
</system.web>
</configuration>
enableVersionHeader usuwa X-AspNet-Version, który również zdradza wersję frameworka.
Platformy hostowane
Na Shopify, Wix, Squarespace i Webflow serwerami zarządza platforma i to ona ustawia nagłówki. Nie ogłaszają one wersji, które miałyby znaczenie, a jeśli lista kontrolna jakąś tam znajdzie, po Twojej stronie nie ma nic do zmiany.
Potwierdź poprawkę
Uruchom ponownie oba polecenia curl z sekcji Sprawdź sam, potem otwórz cel w PulseKeeper i kliknij Sprawdź teraz na zakładce Lista kontrolna. Pozycja zmieni się na OK w ciągu kilku minut, a nie dopiero przy kolejnym codziennym sprawdzeniu.