Situația actuală: PHP2Shell. Două vulnerabilități critice PHP (CVSS 9.2) permit cod malițios fără autentificare. Patchuri din 21.10.2026.Ce este de făcut acum →

expose_php și antetele Server: ascunderea indicațiilor de versiune

PHP, Nginx și Apache își indică implicit numărul versiunii în fiecare răspuns. Asta nu protejează de atacuri, dar oferă scannerelor o listă de ținte la îndemână. Cum opriți asta și păstrați totuși privirea de ansamblu.

Stadiu 6 min de cititSecurizare și configurare

Pe scurt: Cu expose_php = Off în php.ini dispare antetul X-Powered-By: PHP/…. Se adaugă server_tokens off; în Nginx, precum și ServerTokens Prod și ServerSignature Off în Apache. Asta nu face niciun server mai sigur, dar le ia scanărilor automate o listă gata făcută de versiuni. Nivelul propriu de patchuri îl verificați apoi prin managerul de pachete și procese, nu prin antete.

Cartea de vizită din fiecare răspuns

Cine a vrut să afle după 21 octombrie 2026 câte servere mai arată o versiune PHP veche nu a trebuit să caute mult. Multe servere web își indică versiunea PHP în fiecare răspuns, de exemplu ca X-Powered-By: PHP/8.2.20. Serviciile de căutare la nivelul întregului internet citesc și aceste informații, iar Unit 42 de la Palo Alto Networks a numărat pentru PHP2Shell mai mult de 22,6 milioane de instanțe expuse, potențial vulnerabile.

Pentru atacatori, o astfel de indicație este un scurtcircuit. Ei pot presorta țintele, în loc să încerce orbește. Pentru operatori este, în schimb, inutilă, căci nu dovedește nici măcar propriul nivel de patchuri: distribuțiile livrează adesea corecturile ca backport, fără un număr de versiune nou.

Acest articol arată unde dezvăluie PHP și serverul web informații de versiune și cum opriți aceste indicații. El spune deschis și ce aduce asta și ce nu.

Unde apar peste tot indicațiile de versiune

Versiunea PHP este doar unul dintre mai multe locuri. Merită o privire completă, pentru că un singur loc uitat devalorizează celelalte măsuri.

Loc de descoperire Exemplu Se oprește prin
Antetul HTTP al PHP X-Powered-By: PHP/8.3.x expose_php = Off în php.ini
Antetul HTTP al serverului web Server: nginx/1.x sau Server: Apache/2.4.x (Debian) server_tokens off; respectiv ServerTokens Prod
Paginile de eroare ale serverului web linie de versiune sub paginile 404 sau 500 aceleași setări, la Apache suplimentar ServerSignature Off
Antetele aplicației indicații proprii X-Powered-By ale framework-urilor fastcgi_hide_header respectiv Header unset
Fișiere în webroot fișiere de test phpinfo(), fișiere readme și changelog ștergere sau blocare
Mesaje de eroare PHP căi și detalii de versiune în browser display_errors = Off

Fișierele de test cu phpinfo() sunt aici sursa cea mai bogată pentru atacatori. Ele dezvăluie nu doar versiunea, ci întreaga configurație; mai multe în articolul Fișierele phpinfo(): de ce trebuie să dispară.

Dezactivarea expose_php în php.ini

Potrivit manualului PHP, expose_php este implicit activat și poate fi modificat doar în php.ini, nu în pool, nu prin .htaccess și nu în timpul execuției. Stabiliți de aceea valoarea în php.ini al fiecărui mod de operare care livrează site-uri, deci la Debian și Ubuntu, de exemplu, în /etc/php/<version>/fpm/ și, după caz, în /etc/php/<version>/apache2/.

; php.ini al SAPI web, apoi reporniți PHP-FPM respectiv Apache
expose_php = Off

Dacă rulează în paralel mai multe versiuni PHP, fiecare are nevoie de intrarea ei. Repornirea serviciului respectiv este obligatorie, pentru că PHP citește php.ini doar la pornire.

Scurtarea antetelor Server în Nginx și Apache

Nginx își indică implicit versiunea în antetul Server și pe paginile de eroare. Cu server_tokens off; rămâne doar numele produsului. În plus, un antet X-Powered-By pe care îl setează aplicația singură poate fi filtrat cu fastcgi_hide_header. Potrivit documentației Nginx, Nginx ascunde de la sine doar Status și X-Accel-…, nu X-Powered-By.

# în blocul http, se aplică tuturor site-urilor
server_tokens off;
fastcgi_hide_header X-Powered-By;

În Apache, ServerTokens controlează antetul Server și, în același timp, linia de versiune de sub paginile de eroare. Potrivit documentației Apache, setarea se aplică doar la nivel de server, nu pentru fiecare VirtualHost. Deoarece răspunsurile PHP-FPM ajung prin mod_proxy_fcgi într-un alt tabel de antete decât răspunsurile serverului însuși, aplicați eliminarea în ambele variante.

# configurație la nivel de server, de ex. /etc/apache2/conf-available/security.conf
ServerTokens Prod
ServerSignature Off

# necesită mod_headers
<IfModule mod_headers.c>
    Header unset X-Powered-By
    Header always unset X-Powered-By
</IfModule>

Verificați configurația înainte de reîncărcare cu nginx -t respectiv apachectl configtest. Cum activați activ, prin antete, protecția pentru vizitatori, de exemplu cu HSTS sau cu o Content-Security-Policy, descrie ghidul Antete de securitate pentru site-uri.

Cum verificați rezultatul din exterior

După trecere, verificați fiecare domeniu în parte, pe cât posibil și o pagină de eroare. Comenzile următoare trimit doar cereri normale către propriile dumneavoastră site-uri:

# Antetele paginii de start
curl -sI https://www.example.de/ | grep -iE '^(server|x-powered-by):'
# Antetele unei pagini inexistente
curl -sI https://www.example.de/gibt-es-nicht-4711 | grep -iE '^(server|x-powered-by):'

Se așteaptă un antet Server fără număr de versiune și niciun X-Powered-By. Dacă mai apare o versiune PHP, de obicei este activ un alt php.ini sau un serviciu nu a fost încă repornit. Dacă în fața serverului se află un CDN, verificați suplimentar direct serverul de origine, în măsura în care este accesibil.

Sfat

Consemnați totuși intern versiunea PHP: în inventarul serverelor, cu starea pachetului și data ultimei verificări. Nivelul de patchuri îl dovediți prin server, așa cum este descris în Verificarea corectă a versiunii PHP și a nivelului de patchuri.

Ce aduce ascunderea și ce nu

Încadrată sincer, dezactivarea indicațiilor de versiune este o măsură mică, cu efort redus. Ea reduce probabilitatea de a apărea în căutări țintite după anumite versiuni și diminuează informațiile pe care un atacator le obține fără efort.

Nu protejează însă de atacurile automate, care își trimit cererile pur și simplu către orice server accesibil. Cum decurg astfel de scanări în masă descrie articolul Scanări în masă după PHP nepatchuit. Împotriva PHP2Shell ajută doar actualizarea la PHP 8.5.12, 8.4.27, 8.3.36 sau 8.2.35, respectiv un backport confirmat, urmată de repornirea tuturor proceselor PHP.

Un efect secundar este, în schimb, deosebit de util: cine dezactivează în exterior indicațiile de versiune trebuie să-și inventarieze curat versiunile în interior. Într-o situație ca PHP2Shell, tocmai această privire de ansamblu decide cât de repede aflați ce servere sunt afectate.

Ascunderea are sens de aceea ca parte a unei securizări de bază, nu ca măsură izolată. Ea aparține aceleiași liste de control cu ieșirile de erori dezactivate, fișierele de test șterse și valorile de configurare blocate.

Cum ajută PHP SOS concret?

  • Inventarierea locurilor de descoperire: Verificăm antetele, paginile de eroare și webroot-ul tuturor domeniilor pentru indicații de versiune și fișiere de test uitate.
  • Adaptarea configurației: Stabilim expose_php, antetele Server și filtrele de antete în fiecare versiune PHP și în fiecare server web și repornim controlat serviciile.
  • Dovedirea internă a nivelului de patchuri: Documentăm versiunile și stările pachetelor acolo unde le este locul, în inventar, nu în antetul HTTP.
  • Integrarea în securizare: Măsura face parte din securizarea serverului pentru servere web PHP.

Întrebări frecvente

Îmi face expose_php = Off serverul sigur?

Nu. Setarea elimină doar indicația de versiune din antetul HTTP. O versiune PHP vulnerabilă rămâne vulnerabilă, iar atacurile automate își încearcă oricum adesea cererile pe orice server accesibil. Ele le iau însă atacatorilor o preselecție ușoară și reduc vizibilitatea în motoarele de căutare pentru servere.

Pot seta expose_php în pool-ul FPM sau prin .htaccess?

Potrivit manualului PHP, expose_php poate fi modificat doar în php.ini. Stabiliți de aceea valoarea în php.ini al fiecărui SAPI web și reporniți apoi PHP-FPM sau Apache.

De ce văd X-Powered-By în ciuda expose_php = Off?

Atunci, de obicei aplicația sau un framework setează singur antetul ori este activ un alt php.ini. Eliminați suplimentar antetul în serverul web: cu fastcgi_hide_header în Nginx sau cu Header unset în Apache.

Cum îmi verific nivelul de patchuri dacă versiunea nu mai este vizibilă?

Prin serverul însuși: managerul de pachete, changelog-ul pachetului cu numerele CVE și momentul de pornire al proceselor PHP. Indicația din antetul HTTP nu era oricum o dovadă, pentru că distribuțiile aplică backporturi adesea fără un număr de versiune nou.

Surse

Contact imediat

Fiecare oră contează. Scrieți-ne acum.

Descrieți pe scurt sistemul, versiunea PHP și ce ați observat. Ne vom face auziți, clarificăm situația și lucrăm la distanță până când incidentul este încheiat și documentat.

Ajutor imediat