Röviden: A php.ini-ben megadott expose_php = Off hatására eltűnik az X-Powered-By: PHP/… fejléc. Ehhez tartozik a server_tokens off; az Nginxben, valamint a ServerTokens Prod és a ServerSignature Off az Apache-ban. Ettől egyetlen szerver sem lesz biztonságosabb, de az automatizált vizsgálatoktól elvesz egy kész verzióslistát. A saját javítási állapotot ezután a csomagkezelőn és a folyamatokon keresztül ellenőrizze, nem a fejléceken.
A névjegykártya minden válaszban
Aki 2026. október 21. után tudni akarta, hány szerver mutat még régi PHP-verziót, nem sokáig keresgélt. Sok webszerver minden egyes válaszban megnevezi a PHP-verzióját, például X-Powered-By: PHP/8.2.20 formában. Az internetszintű keresőszolgáltatások beolvassák ezeket az adatokat, és a Palo Alto Networks Unit 42 csapata a PHP2Shellhez több mint 22,6 millió kitett, potenciálisan sebezhető példányt számolt.
A támadók számára egy ilyen adat rövidítés. Előválogathatják a célpontokat, ahelyett hogy vakon próbálkoznának. Az üzemeltetők számára viszont haszontalan, mert még a saját javítási állapotot sem bizonyítja: a disztribúciók a javításokat gyakran backportként, új verziószám nélkül szállítják.
Ez a cikk megmutatja, hol árulnak el verzióinformációkat a PHP és a webszerver, és hogyan kapcsolhatja ki az adatokat. Őszintén azt is megmondja, mit ér ez, és mit nem.
Hol bukkannak fel mindenhol verziómegjelölések
A PHP-verzió csak egyike a több helynek. Megéri a teljes körű áttekintés, mert egyetlen elfelejtett hely értéktelenné teszi a többi intézkedést.
| Lelőhely | Példa | Kikapcsolás módja |
|---|---|---|
| A PHP HTTP-fejléce | X-Powered-By: PHP/8.3.x |
expose_php = Off a php.ini-ben |
| A webszerver HTTP-fejléce | Server: nginx/1.x vagy Server: Apache/2.4.x (Debian) |
server_tokens off; illetve ServerTokens Prod |
| A webszerver hibaoldalai | verziósor a 404-es vagy 500-as oldalak alatt | ugyanezek a beállítások, az Apache-ban ezenkívül ServerSignature Off |
| Az alkalmazás fejlécei | a keretrendszerek saját X-Powered-By megjelölései |
fastcgi_hide_header illetve Header unset |
| Fájlok a webrootban | phpinfo() tesztfájlok, readme- és changelog-fájlok |
törölni vagy zárolni |
| PHP-hibaüzenetek | útvonalak és verziórészletek a böngészőben | display_errors = Off |
A phpinfo() tesztfájlok a támadók számára a legtermékenyebb forrás. Nemcsak a verziót árulják el, hanem a teljes konfigurációt; erről bővebben a phpinfo()-fájlok: miért kell eltűnniük cikkben.
Az expose_php kikapcsolása a php.ini-ben
A PHP kézikönyve szerint az expose_php alapértelmezetten be van kapcsolva, és csak a php.ini-ben módosítható, a poolban nem, .htaccess-szel nem, és futásidőben sem. Az értéket ezért a weboldalakat kiszolgáló minden üzemmód php.ini-jében állítsa be, vagyis Debianon és Ubuntun például a /etc/php/<version>/fpm/ alatt, és adott esetben a /etc/php/<version>/apache2/ alatt.
; A webes SAPI php.ini-je, utána a PHP-FPM-et illetve az Apache-ot újraindítani
expose_php = Off
Ha több PHP-verzió fut párhuzamosan, mindegyiknek szüksége van a bejegyzésre. Az érintett szolgáltatás újraindítása kötelező, mert a PHP a php.ini-t csak induláskor olvassa be.
A Server-fejléc rövidítése az Nginxben és az Apache-ban
Az Nginx alapértelmezetten megnevezi a verzióját a Server fejlécben és a hibaoldalakon. A server_tokens off; esetén csak a terméknév marad. Ezenfelül az alkalmazás által maga beállított X-Powered-By fejléc a fastcgi_hide_header-rel kiszűrhető. Az Nginx dokumentációja szerint az Nginx magától csak a Status és az X-Accel-… fejléceket rejti el, az X-Powered-By-t nem.
# a http-blokkban, minden weboldalra érvényes
server_tokens off;
fastcgi_hide_header X-Powered-By;
Az Apache-ban a ServerTokens a Server fejlécet és egyúttal a hibaoldalak alatti verziósort szabályozza. A beállítás az Apache dokumentációja szerint csak szerverszinten érvényes, nem VirtualHostonként. Mivel a PHP-FPM válaszai a mod_proxy_fcgi-n keresztül más fejléctáblába kerülnek, mint a szerver saját válaszai, az eltávolítást mindkét változatban állítsa be.
# szerverszintű konfiguráció, pl. /etc/apache2/conf-available/security.conf
ServerTokens Prod
ServerSignature Off
# a mod_headers szükséges hozzá
<IfModule mod_headers.c>
Header unset X-Powered-By
Header always unset X-Powered-By
</IfModule>
Az újratöltés előtt ellenőrizze a konfigurációt az nginx -t illetve az apachectl configtest paranccsal. Hogyan kapcsolhat be a fejlécekkel aktívan védelmet a látogatók számára, például HSTS-sel vagy Content-Security-Policyvel, azt a Biztonsági fejlécek weboldalakhoz útmutató írja le.
Így ellenőrizze az eredményt kívülről
Az átállás után ellenőrizze egyenként az összes domaint, lehetőleg egy hibaoldalt is. A következő parancsok csak normál kéréseket küldenek a saját weboldalaira:
# A nyitóoldal fejlécei
curl -sI https://www.example.de/ | grep -iE '^(server|x-powered-by):'
# Egy nem létező oldal fejlécei
curl -sI https://www.example.de/gibt-es-nicht-4711 | grep -iE '^(server|x-powered-by):'
Elvárt egy verziószám nélküli Server fejléc és X-Powered-By hiánya. Ha továbbra is PHP-verzió áll ott, többnyire egy másik php.ini aktív, vagy egy szolgáltatást még nem indítottak újra. Ha a szerver előtt CDN áll, ellenőrizze ezenkívül közvetlenül az origin szervert is, ha elérhető.
A PHP-verziót belsőleg mégis tartsa nyilván: a szerverleltárban, a csomagállapottal és az utolsó ellenőrzés dátumával. A javítási állapotot a szerveren keresztül bizonyítsa, ahogyan a A PHP-verzió és a javítási állapot helyes ellenőrzése leírja.
Mit ér az elrejtés, és mit nem
Őszintén besorolva a verziómegjelölések kikapcsolása kis intézkedés csekély ráfordítással. Csökkenti annak valószínűségét, hogy bizonyos verziókra irányuló célzott keresésekben felbukkanjon, és kevesebb olyan információt ad, amelyet a támadó fáradság nélkül megkap.
Az automatizált támadások ellen viszont nem véd, amelyek a kéréseiket egyszerűen minden elérhető szerverre elküldik. Hogyan zajlanak az ilyen tömeges vizsgálatok, azt a Tömeges vizsgálatok javítatlan PHP után cikk írja le. A PHP2Shell ellen csak a PHP 8.5.12, 8.4.27, 8.3.36 vagy 8.2.35 verzióra, illetve egy megerősített backportra való frissítés segít, amelyet az összes PHP-folyamat újraindítása követ.
Egy mellékhatás ezzel szemben kifejezetten hasznos: aki kifelé kikapcsolja a verziómegjelöléseket, annak belül rendesen nyilván kell tartania a verzióit. Egy olyan helyzetben, mint a PHP2Shell, éppen ez az áttekintés dönti el, milyen gyorsan tudja meg, mely szerverek érintettek.
Az elrejtésnek ezért egy alapkeményítés részeként van értelme, nem önálló intézkedésként. Ugyanabba az ellenőrzőlistába tartozik, mint a kikapcsolt hibakimenetek, a törölt tesztfájlok és a zárolt konfigurációs értékek.
Hogyan segít konkrétan a PHP SOS?
- A lelőhelyek felmérése: Az összes domain fejléceit, hibaoldalait és webrootját ellenőrizzük verziómegjelölések és elfelejtett tesztfájlok után.
- A konfiguráció igazítása: Az
expose_php, a Server-fejlécek és a fejlécszűrők beállítását minden PHP-verzióban és webszerverben elvégezzük, és a szolgáltatásokat ellenőrzötten újraindítjuk. - A javítási állapot belső igazolása: A verziókat és csomagállapotokat ott dokumentáljuk, ahová valók, a leltárban, nem a HTTP-fejlécben.
- Beágyazás a keményítésbe: Az intézkedés a PHP-webszerverek szerverkeményítésének része.
Gyakori kérdések
Biztonságossá teszi a szerveremet az expose_php = Off?
Nem. A beállítás csak a verziómegjelölést távolítja el a HTTP-fejlécből. Egy sebezhető PHP-verzió sebezhető marad, és az automatizált támadások a kéréseiket gyakran egyébként is kipróbálják minden elérhető szerveren. A támadóktól viszont elvesz egy egyszerű előválogatást, és csökkenti a szerverek keresőmotorjaiban való láthatóságot.
Beállíthatom az expose_php-t az FPM-poolban vagy .htaccess-szel?
A PHP kézikönyve szerint az expose_php csak a php.ini-ben módosítható. Ezért az értéket minden webes SAPI php.ini-jében állítsa be, majd indítsa újra a PHP-FPM-et vagy az Apache-ot.
Miért látom az X-Powered-By fejlécet az expose_php = Off ellenére?
Ilyenkor többnyire maga az alkalmazás vagy egy keretrendszer állítja be a fejlécet, vagy egy másik php.ini az aktív. Távolítsa el a fejlécet ezenkívül a webszerverben is: az Nginxben a fastcgi_hide_header-rel, az Apache-ban a Header unset-tel.
Hogyan ellenőrzöm a javítási állapotomat, ha a verzió már nem látható?
Magán a szerveren keresztül: csomagkezelő, a CVE-számokat tartalmazó csomag-changelog és a PHP-folyamatok indítási ideje. A HTTP-fejlécben szereplő adat egyébként sem volt bizonyíték, mert a disztribúciók a backportokat gyakran új verziószám nélkül telepítik.