Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

expose_php un Server galvenes: versiju norāžu slēpšana

PHP, Nginx un Apache pēc noklusējuma katrā atbildē min savu versijas numuru. Tas neaizsargā pret uzbrukumiem, bet skeneriem sniedz ērtu mērķu sarakstu. Kā to izslēgt un tomēr saglabāt pārskatu.

Aktuāls uz 5 min lasīšanas laiksNostiprināšana un konfigurācija

Īsi sakot: Ar expose_php = Off failā php.ini pazūd galvene X-Powered-By: PHP/…. Tam pievienojas server_tokens off; Nginx, kā arī ServerTokens Prod un ServerSignature Off Apache. Tas neviena servera nepadara drošāku, bet automatizētām skenēšanām atņem gatavu versiju sarakstu. Savu ielāpu stāvokli pēc tam pārbaudiet caur pakotņu pārvaldnieku un procesiem, nevis caur galvenēm.

Vizītkarte katrā atbildē

Kas pēc 2026. gada 21. oktobra gribēja uzzināt, cik daudz serveru vēl rāda vecu PHP versiju, tam ilgi nebija jāmeklē. Daudzi tīmekļa serveri savu PHP versiju min katrā atsevišķā atbildē, piemēram, kā X-Powered-By: PHP/8.2.20. Interneta mēroga meklēšanas pakalpojumi šīs norādes nolasa līdzi, un Palo Alto Networks Unit 42 par PHP2Shell saskaitīja vairāk nekā 22,6 miljonus eksponētu, potenciāli ievainojamu instanču.

Uzbrucējiem šāda norāde ir saīsinājums. Viņi var mērķus iepriekš sakārtot, nevis izmēģināt akli. Uzturētājiem tā turpretī ir nevērtīga, jo tā nepierāda pat paša ielāpu stāvokli: distributīvi labojumus bieži piegādā kā backport bez jauna versijas numura.

Šis raksts rāda, kur PHP un tīmekļa serveris atklāj versiju informāciju un kā šīs norādes izslēgt. Tas arī atklāti pasaka, ko tas dod un ko ne.

Kur visur parādās versiju norādes

PHP versija ir tikai viena no vairākām vietām. Pilns skatiens ir vērtīgs, jo viena aizmirsta vieta padara citus pasākumus bezvērtīgus.

Atrašanās vieta Piemērs Izslēgt caur
PHP HTTP galvene X-Powered-By: PHP/8.3.x expose_php = Off failā php.ini
Tīmekļa servera HTTP galvene Server: nginx/1.x vai Server: Apache/2.4.x (Debian) server_tokens off; resp. ServerTokens Prod
Tīmekļa servera kļūdu lapas versijas rindiņa zem 404 vai 500 lapām tie paši iestatījumi, Apache papildus ServerSignature Off
Lietojumprogrammas galvene ietvaru paši X-Powered-By ieraksti fastcgi_hide_header resp. Header unset
Faili tīmekļa saknē phpinfo() testa faili, Readme un Changelog faili dzēst vai bloķēt
PHP kļūdu ziņojumi ceļi un versiju detaļas pārlūkā display_errors = Off

Testa faili ar phpinfo() uzbrucējiem ir auglīgākais avots. Tie atklāj ne tikai versiju, bet visu konfigurāciju; vairāk rakstā phpinfo() faili: kāpēc tiem jāpazūd.

expose_php izslēgšana failā php.ini

Saskaņā ar PHP rokasgrāmatu expose_php pēc noklusējuma ir ieslēgts un maināms tikai php.ini, nevis pūlā, nevis ar .htaccess un nevis izpildes laikā. Iestatiet vērtību tāpēc php.ini katram darbības režīmam, kas piegādā vietnes, tātad Debian un Ubuntu, piemēram, zem /etc/php/<version>/fpm/ un vajadzības gadījumā /etc/php/<version>/apache2/.

; tīmekļa SAPI php.ini, pēc tam pārstartēt PHP-FPM resp. Apache
expose_php = Off

Ja paralēli darbojas vairākas PHP versijas, katrai vajadzīgs savs ieraksts. Attiecīgā pakalpojuma pārstartēšana ir obligāta, jo PHP php.ini nolasa tikai startējot.

Server galvenes saīsināšana Nginx un Apache

Nginx savu versiju pēc noklusējuma min Server galvenē un kļūdu lapās. Ar server_tokens off; paliek tikai produkta nosaukums. Papildus X-Powered-By galveni, ko iestata pati lietojumprogramma, var izfiltrēt ar fastcgi_hide_header. Saskaņā ar Nginx dokumentāciju Nginx pats paslēpj tikai Status un X-Accel-…, nevis X-Powered-By.

# http blokā, darbojas visām vietnēm
server_tokens off;
fastcgi_hide_header X-Powered-By;

Apache ServerTokens vada Server galveni un vienlaikus versijas rindiņu zem kļūdu lapām. Saskaņā ar Apache dokumentāciju iestatījums darbojas tikai visā serverī, nevis katram VirtualHost. Tā kā PHP-FPM atbildes caur mod_proxy_fcgi nonāk citā galvenes tabulā nekā paša servera atbildes, noņemšanu iestatiet abos variantos.

# servera mēroga konfigurācija, piem., /etc/apache2/conf-available/security.conf
ServerTokens Prod
ServerSignature Off

# vajadzīgs mod_headers
<IfModule mod_headers.c>
    Header unset X-Powered-By
    Header always unset X-Powered-By
</IfModule>

Pirms pārlādes konfigurāciju pārbaudiet ar nginx -t resp. apachectl configtest. Kā ar galvenēm aktīvi ieslēgt aizsardzību apmeklētājiem, piemēram, ar HSTS vai Content-Security-Policy, apraksta ceļvedis Vietņu drošības galvenes.

Kā pārbaudīt rezultātu no ārpuses

Pēc pārejas pārbaudiet katru domēnu atsevišķi, pēc iespējas arī kļūdu lapu. Turpmākās komandas sūta tikai parastus pieprasījumus uz jūsu pašu vietnēm:

# Sākumlapas galvenes
curl -sI https://www.example.de/ | grep -iE '^(server|x-powered-by):'
# Neesošas lapas galvenes
curl -sI https://www.example.de/gibt-es-nicht-4711 | grep -iE '^(server|x-powered-by):'

Sagaidāma ir Server galvene bez versijas numura un bez X-Powered-By. Ja tur joprojām ir PHP versija, parasti ir aktīvs cits php.ini vai kāds pakalpojums vēl nav pārstartēts. Ja pirms servera atrodas CDN, papildus pārbaudiet izcelsmes serveri tieši, ciktāl tas ir sasniedzams.

Padoms

PHP versiju tomēr fiksējiet iekšēji: savā serveru inventārā, ar pakotņu stāvokli un pēdējās pārbaudes datumu. Ielāpu stāvokli pierādiet caur serveri, kā aprakstīts sadaļā PHP versijas un ielāpu stāvokļa pareiza pārbaude.

Ko slēpšana dod un ko ne

Godīgi ierindojot, versiju norāžu izslēgšana ir neliels pasākums ar mazu piepūli. Tas samazina varbūtību parādīties mērķtiecīgās noteiktu versiju meklēšanās un samazina informāciju, ko uzbrucējs iegūst bez piepūles.

Tas tomēr neaizsargā pret automatizētiem uzbrukumiem, kas savus pieprasījumus vienkārši sūta katram sasniedzamam serverim. Kā šādas masveida skenēšanas norit, apraksta raksts Masveida skenēšanas pēc neielāpota PHP. Pret PHP2Shell palīdz tikai atjauninājums uz PHP 8.5.12, 8.4.27, 8.3.36 vai 8.2.35 resp. apstiprinātu backport, kam seko visu PHP procesu pārstartēšana.

Blakusefekts turpretī ir izteikti noderīgs: kas versiju norādes uz ārpusi izslēdz, tam savas versijas iekšēji jāuzskaita pareizi. Tādā situācijā kā PHP2Shell tieši šis pārskats izšķir, cik ātri uzzināt, kuri serveri ir skarti.

Slēpšana tāpēc ir jēgpilna kā pamata nostiprināšanas daļa, nevis atsevišķs pasākums. Tā pieder tajā pašā kontrolsarakstā ar izslēgtu kļūdu izvadi, izdzēstiem testa failiem un nobloķētām konfigurācijas vērtībām.

Kā PHP SOS palīdz konkrēti?

  • Uzskaitīt atrašanās vietas: mēs pārbaudām visu domēnu galvenes, kļūdu lapas un tīmekļa sakni attiecībā uz versiju norādēm un aizmirstiem testa failiem.
  • Pielāgot konfigurāciju: mēs iestatām expose_php, Server galvenes un galveņu filtrus katrā PHP versijā un tīmekļa serverī un kontrolēti pārstartējam pakalpojumus.
  • Ielāpu stāvokli pierādīt iekšēji: mēs dokumentējam versijas un pakotņu stāvokļus tur, kur tie pieder, inventārā, nevis HTTP galvenē.
  • Iekļaut nostiprināšanā: pasākums ir daļa no mūsu PHP tīmekļa serveru nostiprināšanas.

Biežāk uzdotie jautājumi

Vai expose_php = Off padara manu serveri drošu?

Nē. Iestatījums tikai noņem versijas norādi no HTTP galvenes. Ievainojama PHP versija paliek ievainojama, un automatizēti uzbrukumi savus pieprasījumus bieži tāpat izmēģina katrā sasniedzamā serverī. Taču jūs atņemat uzbrucējiem vienkāršu priekšatlasi un samazināt redzamību serveru meklētājprogrammās.

Vai expose_php varu iestatīt FPM pūlā vai ar .htaccess?

Saskaņā ar PHP rokasgrāmatu expose_php ir maināms tikai php.ini. Tāpēc iestatiet vērtību katras tīmekļa SAPI php.ini un pēc tam pārstartējiet PHP-FPM vai Apache.

Kāpēc es redzu X-Powered-By, neraugoties uz expose_php = Off?

Tad galveni parasti iestata pati lietojumprogramma vai ietvars, vai arī ir aktīvs cits php.ini. Papildus noņemiet galveni tīmekļa serverī: ar fastcgi_hide_header Nginx vai Header unset Apache.

Kā pārbaudīt savu ielāpu stāvokli, ja versija vairs nav redzama?

Caur pašu serveri: pakotņu pārvaldnieks, pakotnes changelog ar CVE numuriem un PHP procesu startēšanas laiks. Norāde HTTP galvenē tāpat nebija pierādījums, jo distributīvi backport bieži ievieš bez jauna versijas numura.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība