# Soubory phpinfo(): proč musí zmizet

> Zapomenutý soubor phpinfo prozradí cesty, moduly a někdy i přístupové údaje. Jak takové soubory najít, odstranit a PHP kontrolovat bezpečněji.

Zdroj: https://phpsos.de/cs/blog/phpinfo-dateien-entfernen/  
Stav: 25.10.2026  
Poskytovatel: PHP SOS, Nouzová pomoc pro PHP a bezpečnost serverů. Okamžitá pomoc přes WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20den%2C%20PHP%20SOS%2C%20pot%C5%99ebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20PHP%20serverem.%20Firma%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**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](https://phpsos.de/cs/blog/env-dateien-schuetzen/).

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](https://phpsos.de/cs/php2shell/php-version-pruefen/).

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](https://phpsos.de/cs/php/php-ini-erklaert/). 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í.

1. **Vyhledat soubory s voláním phpinfo** (upravte cestu):

```bash
grep -rlE "phpinfo[[:space:]]*\(" /var/www --include="*.php" 2>/dev/null
```

2. **Zkontrolovat typické názvy souborů**, i bez nálezu v obsahu:

```bash
find /var/www -type f \( -iname "info.php" -o -iname "phpinfo.php" -o -iname "test.php" -o -iname "i.php" \) 2>/dev/null
```

3. **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í.

4. **Před smazáním zkontrolovat přístupy v logu**:

```bash
grep -E "GET /(info|phpinfo|test|i)\.php" /var/log/nginx/access.log* 2>/dev/null | tail -n 50
```

5. **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.

> **Tip:**
> 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ů](https://phpsos.de/cs/ratgeber/webshell-erkennen/).

## 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](https://phpsos.de/cs/ratgeber/disable-functions/).

```ini
; 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_php` a další zpevnění trvale zavedeme v rámci [hardeningu serveru](https://phpsos.de/cs/leistungen/server-haertung/).

**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.

## Zdroje

- [Příručka PHP: phpinfo()](https://www.php.net/manual/de/function.phpinfo.php)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [php.net: bezpečnostní oznámení](https://www.php.net/)
