Stručne: Súbor, ktorý len volá phpinfo(), ukazuje každému návštevníkovi verziu, moduly, cesty a nastavenia PHP, často aj premenné prostredia s prístupovými údajmi. Pre bezpečnosť phpinfo preto platí: také súbory nikdy nenechávať trvalo vo webovom koreni, po použití ich zmazať a stav PHP radšej kontrolovať cez správu balíkov a konfiguráciu. Stav záplat proti PHP2Shell výstup phpinfo aj tak nedokladá.
Testovací súbor, ktorý zostane
Od 21. 10. 2026 kontrolujú tisíce administrátorov, akú verziu PHP ich weby doručujú. Najrýchlejšia cesta je známa: vytvoriť súbor info.php s jediným riadkom, otvoriť ho v prehliadači, prečítať výsledok. Funguje to. Problém začína potom, keď sa na súbor zabudne.
Takéto súbory prežívajú prekvapivo dlho. Presúvajú sa pri sťahovaní, končia v zálohách a po rokoch sa objavia v priečinkoch, ktoré už nikto nepozná. Automatizované skenery sa neustále pýtajú na typické názvy súborov. Čo bolo pre administrátora pomôckou, je pre útočníka stavebný plán servera.
Obzvlášť postihnuté sú agentúry a hostingy s mnohými webmi zákazníkov. Kto v hektickom týždni kontroluje desiatky webov, rýchlo vytvorí desiatky testovacích súborov. Stačí jediný zabudnutý priečinok a súbor je dostupný ešte o mesiace.
Čo phpinfo() prezrádza a prečo to z hľadiska bezpečnosti záleží
Podľa príručky PHP vypisuje phpinfo() aktuálny stav PHP. Pomocou konštánt sa dá riadiť, ktoré časti sa zobrazia; bez zadania je to všetko.
| Oblasť (konštanta) | Obsah podľa príručky | Prečo je citlivá |
|---|---|---|
INFO_GENERAL |
build, umiestnenie php.ini, webserver, systém | prezrádza operačný systém a cesty |
INFO_CONFIGURATION |
lokálne a master hodnoty všetkých direktív | ukazuje, či disable_functions alebo open_basedir zaberajú |
INFO_MODULES |
načítané rozšírenia s nastaveniami | útočníci vidia, ktoré funkcie sú k dispozícii |
INFO_ENVIRONMENT |
premenné prostredia | často tu sú prístupové údaje k databáze alebo API |
INFO_VARIABLES |
preddefinované premenné (Environment, GET, POST, Cookie, Server) | obsahuje hlavičky a cookies aktuálnej požiadavky |
Najnebezpečnejšie sú posledné dva riadky. Moderné aplikácie rady načítavajú prístupové údaje z premenných prostredia, napríklad zo súboru .env alebo z konfigurácie kontajnera. Tieto hodnoty potom stoja vo výstupe v čistom texte. Ako takéto tajomstvá zásadne chrániť, opisuje článok Správna ochrana prístupových údajov a súborov .env.
K tomu pristupuje: výstup ukazuje hodnoty prebiehajúcej požiadavky, teda aj cookies a hlavičky. Ak môže útočník nasmerovať návštevníka na stránku a prečítať odpoveď, napríklad cez zraniteľnosť Cross-Site Scripting na inom mieste, stanú sa viditeľné aj cookies označené ako HttpOnly.
Prečo phpinfo nie je dôkazom proti PHP2Shell
Mnohí súbor vytvorili práve preto, aby skontrolovali stav záplat. Na to sa však hodí len obmedzene. Distribúcie a hostingy často nasadzujú opravy ako backport; podľa správ ukazuje napríklad Ubuntu 24.04 po aktualizácii naďalej 8.3.6. Zobrazené číslo teda hovorí málo. Naopak, aktuálne číslo nedokazuje, že sa všetky workery reštartovali.
Spoľahlivý je stav balíka s číslami CVE v changelogu, doplnený reštartom všetkých procesov PHP. Ako na to, vysvetľuje článok Správna kontrola verzie PHP a stavu záplat.
Krátkodobý výstup vo webovom kontexte má napriek tomu svoje miesto: ukazuje, ktoré php.ini a ktoré hodnoty pre web skutočne platia, pretože príkazový riadok často číta inú konfiguráciu. Súvislosti o úrovniach a prednosti vysvetľuje php.ini jednoducho. Ak to potrebujete, tak s ochranou prístupu, s náhodným názvom súboru a len na minúty.
Pre väčšinu otázok existujú aj tak lepšie cesty. Verzia PHP poolu FPM je uvedená v jeho konfigurácii a v zozname procesov. Jednotlivé hodnoty sa dajú zistiť skriptom mimo webového koreňa cez ini_get(), bez toho, aby sa odhalilo všetko. A v hostingových paneloch ukazuje rozhranie pridelenú verziu pre každý web, hoci bez informácie o backportoch.
Nájdenie zabudnutých súborov: konkrétne kroky kontroly
Takto vystopujete staré záťaže na serveri s Linuxom. Príkazy len čítajú a nič nemenia.
- Vyhľadať súbory s volaním phpinfo (upraviť cestu):
grep -rlE "phpinfo[[:space:]]*\(" /var/www --include="*.php" 2>/dev/null
- Skontrolovať typické názvy súborov, aj bez nálezu v obsahu:
find /var/www -type f \( -iname "info.php" -o -iname "phpinfo.php" -o -iname "test.php" -o -iname "i.php" \) 2>/dev/null
-
Nálezy vyhodnotiť: nie každé nájdené miesto je testovací súbor. Administrátorské nástroje, panely alebo frameworky môžu používať
phpinfo()za prihlásením. Rozhodujúce je, či je súbor dostupný z internetu bez prihlásenia. -
Pozrieť prístupy v logu, skôr než zmažete:
grep -E "GET /(info|phpinfo|test|i)\.php" /var/log/nginx/access.log* 2>/dev/null | tail -n 50
- Zmazať a vymeniť tajomstvá: ak vo výstupe stálo heslo alebo kľúč a súbor bol verejný, hodnota sa považuje za známu. Zmeňte ju.
Nájdené miesto s neznámym dátumom vytvorenia a nápadným obsahom popri volaní phpinfo môže byť aj zadné vrátko. Vtedy ho nielen zmazať, ale zabezpečiť a nechať skontrolovať, pozri Rozpoznanie a odstránenie webshellov.
Predchádzať trvalo namiesto upratovania
Tri opatrenia zabezpečia, že sa téma nevráti. Po prvé: phpinfo zaradiť do zoznamu disable_functions v php.ini pre webový kontext. Vopred skontrolujte, či váš panel funkciu nepotrebuje pre stránku stavu. Ako nastavenie pôsobí a kde sú jeho hranice, je v článku Správne použitie disable_functions.
; php.ini pre FPM alebo Apache, potom reštartovať všetky procesy PHP
disable_functions = phpinfo
expose_php = Off
Po druhé: poskytovanie len pevným postupom, napríklad cez Git alebo build pipeline, aby sa do webového koreňa nedostávali jednotlivé súbory ručne. Po tretie: informácie o stave patria do monitoringu alebo inventára, nie na verejnú stránku.
expose_php = Off navyše odstráni hlavičku, ktorou PHP v každej odpovedi oznamuje svoju verziu. Nenahrádza to aktualizáciu, ale automatizovaným skenerom to berie pohodlnú informáciu. Kto má viacero ľudí s prístupom na server, mal by sa navyše dohodnúť na jednoduchom pravidle: testovacie súbory sa mažú v tom istom pracovnom kroku, v ktorom vznikli, a nie až „neskôr“.
Ako konkrétne pomáha PHP SOS?
- Prehľadáme vaše webové korene na súbory phpinfo, testovacie skripty a iné staré záťaže a každý nález vyhodnotíme.
- Vyhodnotíme prístupy k nájdeným súborom a povieme vám, ktoré tajomstvá by ste mali vymeniť.
- Stav záplat proti PHP2Shell dokladáme cez changelog balíka a štart procesov namiesto zobrazenia verzie.
disable_functions,expose_phpa ďalšie spevnenia zavádzame trvalo v rámci spevnenia servera (hardening).
Záver: Súbor phpinfo sa vytvorí za sekundy a rovnako rýchlo sa naň zabudne. Kto ho teraz vyhľadá a odstráni, uzavrie zbytočný únik údajov a pri stave záplat sa spolieha na spoľahlivé doklady.
Časté otázky
Je súbor phpinfo sám osebe bezpečnostná zraniteľnosť?
Neotvára prístup, ale poskytuje útočníkom podrobný opis servera: verziu, moduly, cesty, nastavenia a podľa prostredia aj premenné prostredia. To uľahčuje cielené útoky a môže odhaliť prístupové údaje.
Dokazuje číslo verzie v phpinfo, že PHP2Shell je zaplátané?
Nie. Distribúcie a hostingy často nasadzujú opravy ako backport a zobrazené číslo zostáva rovnaké. Stav záplat dokladá changelog balíka a potvrdenie poskytovateľa, k tomu reštart všetkých procesov PHP.
Čo robiť, ak bol súbor phpinfo dlhší čas verejný?
Súbor zmazať, v access logu pozrieť, kto ho sťahoval, a vymeniť všetky tajomstvá, ktoré boli vo výstupe, napríklad databázové heslá alebo kľúče API z premenných prostredia.
Môžem phpinfo() úplne vypnúť?
Áno, cez disable_functions v php.ini webového kontextu. Predtým skontrolujte, či panel alebo aplikácia túto funkciu nepoužíva pre stránky stavu, a procesy PHP potom reštartujte.