Stručně: Soubor, který jen volá phpinfo(), ukáže každému návštěvníkovi verzi, moduly, cesty a nastavení PHP, často i proměnné prostředí s přístupovými údaji. Pro bezpečnost phpinfo proto platí: takové soubory nikdy nenechávejte trvale ve webrootu, po použití je smažte a stav PHP raději kontrolujte přes správu balíčků a konfiguraci. Stav záplat proti PHP2Shell výstup phpinfo stejně nedokazuje.
Testovací soubor, který zůstane
Od 21. 10. 2026 kontrolují tisíce administrátorů, jakou verzi PHP jejich weby doručují. Nejrychlejší cesta je známá: založit soubor info.php s jediným řádkem, otevřít ho v prohlížeči, výsledek přečíst. Funguje to. Problém začíná potom, když se na soubor zapomene.
Takové soubory přežívají překvapivě dlouho. Putují s přesuny, končí v zálohách a po letech se objevují v adresářích, které už nikdo nezná. Automatizované skenery se na typické názvy souborů dotazují neustále. Co bylo pro administrátora pomůckou, je pro útočníka stavební plán serveru.
Obzvlášť zasaženy jsou agentury a hostingové firmy s mnoha weby zákazníků. Kdo v hektickém týdnu kontroluje desítky webů, rychle založí desítky testovacích souborů. Stačí jediná zapomenutá složka a soubor je dostupný ještě po měsících.
Co phpinfo() prozradí a proč na tom pro bezpečnost záleží
Podle příručky PHP vypisuje phpinfo() aktuální stav PHP. Pomocí konstant lze řídit, které části se zobrazí; bez udání je to vše.
| Oblast (konstanta) | Obsah podle příručky | Proč je citlivá |
|---|---|---|
INFO_GENERAL |
build, umístění php.ini, webserver, systém | prozrazuje operační systém a cesty |
INFO_CONFIGURATION |
lokální a hlavní hodnoty všech direktiv | ukazuje, zda disable_functions nebo open_basedir fungují |
INFO_MODULES |
načtená rozšíření s nastavením | útočníci vidí, jaké funkce jsou k dispozici |
INFO_ENVIRONMENT |
proměnné prostředí | zde často stojí přístupové údaje k databázi nebo API |
INFO_VARIABLES |
předdefinované proměnné (Environment, GET, POST, Cookie, Server) | obsahuje hlavičky a cookies aktuálního požadavku |
Nejnebezpečnější jsou poslední dva řádky. Moderní aplikace rády načítají přístupové údaje z proměnných prostředí, například ze souboru .env nebo z konfigurace kontejneru. Tyto hodnoty pak stojí ve výstupu v čitelné podobě. Jak taková tajemství zásadně chránit, popisuje článek Správná ochrana přístupových údajů a souborů .env.
K tomu přistupuje: výstup ukazuje hodnoty probíhajícího požadavku, tedy i cookies a hlavičky. Pokud může útočník návštěvníka nasměrovat na stránku a přečíst odpověď, například přes zranitelnost Cross-Site Scripting na jiném místě, stanou se viditelnými i cookies označené jako HttpOnly.
Proč phpinfo není důkazem proti PHP2Shell
Mnozí soubor založili právě proto, aby zkontrolovali stav záplat. K tomu se ale hodí jen omezeně. Distribuce a hostingové firmy nasazují opravy často jako backport; podle zpráv například Ubuntu 24.04 zobrazuje po aktualizaci dál 8.3.6. Zobrazené číslo tedy říká málo. A naopak: aktuální číslo nedokazuje, že byli restartováni všichni workeři.
Spolehlivý je stav balíčku s čísly CVE v changelogu, doplněný restartem všech procesů PHP. Jak na to, vysvětluje článek Správná kontrola verze PHP a stavu záplat.
Krátkodobý výstup ve webovém kontextu má přesto své místo: ukáže, jaké php.ini a jaké hodnoty pro web skutečně platí, protože příkazová řádka často čte jinou konfiguraci. Souvislosti o úrovních a přednosti vysvětluje stránka php.ini vysvětleno. Pokud to potřebujete, pak chráněné přístupem, s náhodným názvem souboru a jen na minuty.
Pro většinu otázek existují stejně lepší cesty. Verze PHP poolu FPM stojí v jeho konfiguraci a v seznamu procesů. Jednotlivé hodnoty lze zjistit skriptem mimo webroot pomocí ini_get(), aniž by se vše odhalovalo. A v panelech hostingu zobrazuje rozhraní přidělenou verzi pro každý web, byť bez výpovědi o backportech.
Najít zapomenuté soubory: konkrétní kroky kontroly
Takto vystopujete zátěž z minulosti na linuxovém serveru. Příkazy jen čtou a nic nemění.
- Vyhledat soubory s voláním phpinfo (upravte cestu):
grep -rlE "phpinfo[[:space:]]*\(" /var/www --include="*.php" 2>/dev/null
- Zkontrolovat typické názvy souborů, i 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 vyhodnotit: Ne každý nález je testovací soubor. Administrační nástroje, panely nebo frameworky mohou
phpinfo()používat za přihlášením. Rozhodující je, zda je soubor dostupný z internetu bez přihlášení. -
Před smazáním zkontrolovat přístupy v logu:
grep -E "GET /(info|phpinfo|test|i)\.php" /var/log/nginx/access.log* 2>/dev/null | tail -n 50
- Smazat a vyměnit tajemství: Pokud ve výstupu stálo heslo nebo klíč a soubor byl veřejný, hodnota se považuje za známou. Změňte ji.
Nález s neznámým datem vytvoření a nápadným obsahem vedle volání phpinfo může být i zadní vrátka. Pak soubor nejen smažte, ale zajistěte a nechte zkontrolovat, viz Rozpoznání a odstranění webshellů.
Trvale předcházet místo uklízení
Tři opatření zajistí, že se téma nevrátí. Za prvé: phpinfo přidat do seznamu disable_functions v php.ini pro webový kontext. Předem zkontrolujte, zda váš panel funkci nepotřebuje pro stavovou stránku. Jak nastavení funguje a kde jsou jeho meze, stojí v článku Správné použití disable_functions.
; php.ini pro FPM nebo Apache, poté restartovat všechny procesy PHP
disable_functions = phpinfo
expose_php = Off
Za druhé: nasazování jen pevným postupem, například přes Git nebo pipeline pro sestavení, aby se do webrootu nedostávaly jednotlivé soubory ručně. Za třetí: stavové informace patří do monitoringu nebo inventáře, ne na veřejnou stránku.
expose_php = Off navíc odstraní hlavičku, kterou PHP v každé odpovědi sděluje svou verzi. Nenahrazuje to aktualizaci, ale automatizovaným skenerům to bere pohodlnou informaci. Kdo má více osob s přístupem k serveru, měl by navíc dohodnout jednoduché pravidlo: testovací soubory se mažou ve stejném pracovním kroku, v němž byly založeny, ne až „později“.
Jak konkrétně pomáhá PHP SOS?
- Prohledáme vaše webrooty na soubory phpinfo, testovací skripty a další zátěž z minulosti a každý nález posoudíme.
- Vyhodnotíme přístupy k nalezeným souborům a řekneme vám, která tajemství byste měli vyměnit.
- Stav záplat proti PHP2Shell dokládáme changelogem balíčku a restartem procesů, ne zobrazením verze.
- Nastavení
disable_functions,expose_phpa další zpevnění trvale zavedeme v rámci hardeningu serveru.
Závěr: Soubor phpinfo se založí za pár sekund a stejně rychle se zapomene. Kdo ho nyní vyhledá a odstraní, uzavře zbytečný únik dat a u stavu záplat se spoléhá na spolehlivé doklady.
Časté dotazy
Je soubor phpinfo sám o sobě bezpečnostní zranitelností?
Neotevírá přístup, ale poskytuje útočníkům podrobný popis serveru: verzi, moduly, cesty, nastavení a podle prostředí i proměnné prostředí. To usnadňuje cílené útoky a může odhalit přístupové údaje.
Dokazuje číslo verze v phpinfo, že PHP2Shell je záplatováno?
Ne. Distribuce a hostingové firmy nasazují opravy často jako backport a zobrazené číslo zůstává stejné. Stav záplat dokládá changelog balíčku a potvrzení poskytovatele, k tomu restart všech procesů PHP.
Co dělat, když byl soubor phpinfo delší dobu veřejný?
Soubor smazat, v přístupovém logu zjistit, kdo ho stáhl, a vyměnit všechna tajemství, která byla ve výstupu, například hesla k databázi nebo klíče API z proměnných prostředí.
Mohu phpinfo() úplně vypnout?
Ano, přes disable_functions v php.ini webového kontextu. Předem zkontrolujte, zda panel nebo aplikace funkci nepoužívá pro stavové stránky, a procesy PHP poté restartujte.