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):

  1. Otwórz Software → MultiPHP INI Editor.
  2. Przełącz na Editor Mode i wybierz domenę.
  3. Dodaj lub zmień wiersz expose_php = Off i 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:

  1. Otwórz domenę w Cloudflare i przejdź do Rules → Transform Rules → Modify Response Header.
  2. Create rule, nazwij ją Remove X-Powered-By i zastosuj do All incoming requests.
  3. 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.