# PHP disable_functions správne nasadiť

> PHP disable_functions správne nasadiť: ktoré funkcie zablokovať, ako aplikáciu vopred skontrolovať a kde spevnenie naráža na hranice.

Zdroj: https://phpsos.de/sk/ratgeber/disable-functions/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**Stručne:** Pomocou PHP disable_functions zablokujete funkcie, cez ktoré PHP vykonáva systémové príkazy, napríklad `exec`, `shell_exec` alebo `proc_open`. Útočníkom to po vniknutí sťažuje ďalší krok. Nastavenie pôsobí iba z php.ini alebo poolu FPM, musí sa hodiť k aplikácii a nenahrádza aktualizáciu.

## Prečo je disable_functions zmysluplné práve teraz

Pri PHP2Shell ide o vykonanie škodlivého kódu na diaľku bez prihlásenia. Obe zraniteľnosti CVE-2026-109618 a CVE-2026-109619 sídlia v samotnom interpreteri PHP, opravené sú v PHP 8.5.12, 8.4.27, 8.3.36 a 8.2.35. Aktualizácia je jediný spôsob, ako ich uzavrieť.

Spevnenie sa uplatňuje o úroveň neskôr. Kto raz dokáže na serveri vykonať kód, spravidla chce pokračovať: spúšťať systémové príkazy, sťahovať nástroje, zriadiť trvalý backdoor. Mnohé z týchto krokov prebiehajú cez niekoľko funkcií PHP. Ak sú zablokované, cesta je namáhavejšia a nápadnejšia.

disable_functions preto nie je náhradou za záplaty, ale súčasťou ochrany pre prípad, že sa napriek všetkej opatrnosti niečo prederie. Platí to pre budúce zraniteľnosti rovnako ako pre PHP2Shell.

## Čo PHP disable_functions dokáže a čo nie

Nastavenie odstráni uvedené funkcie z behového prostredia. Ak skript zavolá zablokovanú funkciu, PHP skončí s chybou. Blokovanie platí pre každý kód, ktorý v tomto procese PHP beží, teda aj pre zavlečený kód.

Hranice by ste mali poznať:

- Nastavenie nie je uzavretý chránený priestor. Rozšírenia PHP, chyby v interpreteri alebo programy mimo PHP ho môžu obísť.
- Nebráni útočníkovi čítať alebo zapisovať súbory, ku ktorým má používateľ PHP prístup. Za to zodpovedajú práva k súborom a izolácia.
- Pôsobí iba z php.ini alebo ako `php_admin_value`. Cez `ini_set()`, `.user.ini` alebo `.htaccess` sa nastaviť nedá.

Najviac prináša disable_functions spolu s čistou php.ini, samostatnými používateľmi pre každý web a reštriktívnymi právami k súborom. Základy sú v príručke [Bezpečná konfigurácia php.ini](https://phpsos.de/sk/ratgeber/php-ini-sicher-konfigurieren/).

## Ktoré funkcie by ste mali zablokovať

Pre typické weby bez potreby systémových príkazov sa osvedčil nasledujúci zoznam. Zahŕňa funkcie na spúšťanie procesov a riadenie bežiacich procesov.

| Skupina | Funkcie | Typické legitímne využitie |
|---|---|---|
| Vykonávanie príkazov | `exec`, `shell_exec`, `system`, `passthru` | Úprava obrázkov, zálohy cez skript |
| Otváranie procesov | `proc_open`, `popen` | Composer, nástroje na PDF, odosielanie pošty |
| Riadenie procesov | `proc_nice`, `proc_terminate`, `proc_get_status` | Fronty, úlohy na pozadí |
| Správa procesov | `pcntl_exec`, `pcntl_fork` | zvyčajne len v príkazovom riadku |
| Signály a práva | `posix_kill`, `posix_setuid` | zriedka vo webovej prevádzke |

Ako konfigurácia to vyzerá takto:

```ini
; php.ini webového prevádzkového režimu, napr. /etc/php/8.3/fpm/php.ini
disable_functions = exec,shell_exec,system,passthru,proc_open,popen,proc_nice,proc_terminate,proc_get_status,pcntl_exec,pcntl_fork,posix_kill,posix_setuid
```

Ak zoznam nemá platiť pre všetky weby na serveri, nastavte ho pre každý pool FPM. Po opätovnom načítaní skontrolujte, ktorý zoznam v tomto poole skutočne platí:

```ini
; /etc/php/8.3/fpm/pool.d/meine-seite.conf (výťah)
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,proc_open,popen
```

## Aplikáciu vopred skontrolovať: ako sa vyhnúť výpadkom

Kto zoznam nastaví bez kontroly, riskuje, že zmenšovanie obrázkov, PDF faktúry alebo odosielanie pošty prestanú zrazu fungovať. Preto najprv hľadajte dotknuté funkcie v kóde:

```bash
# Kde a ako často sa funkcie v kóde používajú?
grep -rnoE "\b(exec|shell_exec|system|passthru|proc_open|popen|pcntl_exec)\s*\(" /var/www/meine-seite --include="*.php" \
  | cut -d: -f1 | sort | uniq -c | sort -rn | head -30
```

Nálezy automaticky neznamenajú, že sa funkcia v prevádzke potrebuje. Mnohé knižnice najprv overia, či je funkcia dostupná, a inak použijú náhradu. Rozhodujúci je test v staging prostredí so všetkými dôležitými procesmi: objednávka, faktúra, odoslanie formulára, upload obrázka, plánované úlohy.

Ak aplikácia nevyhnutne vyžaduje niektorú z týchto funkcií, preverte systémové požiadavky výrobcu na jeho oficiálnej stránke. Úlohu sa často dá presunúť do samostatného poolu alebo do skriptu pre príkazový riadok, ktorý nie je dostupný cez web.

## Nastavenie aktivovať a účinok skontrolovať

Po zmene musí PHP načítať konfiguráciu znova. Potom skontrolujte hodnotu v prevádzkovom režime svojho webu, nie v príkazovom riadku:

```bash
sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep "^disable_functions"
# V chybovom logu skontrolovať volania zablokovaných funkcií
sudo grep -i "has been disabled" /var/log/php/*.log | tail -20
```

Hlásenia v chybovom logu sú cenné aj neskôr. Ak sa tam náhle objavia volania zablokovaných funkcií, hoci ich vaša aplikácia nepoužíva, môže to naznačovať zavlečený kód. Ako potom postupovať, popisuje príručka [Rozpoznať webshell a odstrániť ju](https://phpsos.de/sk/ratgeber/webshell-erkennen/).

## Typické chyby pri nasadení disable_functions

V praxi spevnenie zriedka stroskotá na technike, ale na drobnostiach. Tieto chyby sú obzvlášť rozšírené:

- **Zmenený nesprávny súbor:** Zoznam je len v php.ini príkazového riadka, web beží cez PHP-FPM a zostáva nechránený.
- **Žiadny reštart:** Súbor je správny, ale bežiace procesy stále pracujú so starou konfiguráciou.
- **Zablokované príliš široko:** Spolu s tým sa zablokujú funkcie ako `ini_set` alebo `mail` a dôležité procesy sa nepozorovane prerušia. Chyby potom často vyjdú najavo až o niekoľko dní, napríklad pri chýbajúcich potvrdeniach objednávok.
- **Raz nastavené, nikdy nekontrolované:** Po sťahovaní, zmene verzie PHP alebo novej inštalácii cez hostingový panel zoznam zmizol.
- **Falošný pocit bezpečia:** Blokovanie sa chápe ako náhrada aktualizácií. Zraniteľnosť v interpreteri však neuzatvára.

Kontrolu aktívnej hodnoty preto zaraďte do svojej rutiny po každej aktualizácii PHP. Stačí krátky pohľad, stojí to takmer žiadny čas a bráni to tichej strate spevnenia.

> **Tip:**
> Pri viacerých weboch na jednom serveri: založte pre každý web samostatný pool s vlastným zoznamom. Dopĺňa to [open_basedir](https://phpsos.de/sk/ratgeber/open-basedir/), ktorý obmedzuje adresáre, ku ktorým môže PHP pristupovať.

## Ako konkrétne pomáha PHP SOS?

- Kód a procesy vašej aplikácie preveríme na používanie kritických funkcií.
- Pre každý web určíme vhodný zoznam blokovaných funkcií a pred spustením do ostrej prevádzky ho otestujeme.
- Blokovanie skombinujeme s poolmi, právami k súborom a zaznamenávaním do ucelenej koncepcie spevnenia.
- Nastavenia zdokumentujeme a chybový log sledujeme kvôli nápadným volaniam.

Ako to prebieha ako celkový balík, popisuje služba [Spevnenie servera pre webové servery PHP](https://phpsos.de/sk/leistungen/server-haertung/).


## Časté otázky

**Môžem disable_functions nastaviť cez ini_set() alebo .htaccess?**  
Nie. Nastavenie pôsobí iba z php.ini alebo ako php_admin_value v poole FPM, resp. v konfigurácii Apache. Za behu sa nastaviť nedá a aplikácia zablokované funkcie ani nemôže opäť uvoľniť.

**Chráni disable_functions pred PHP2Shell?**  
Nie. PHP2Shell sa týka samotného interpretera PHP, zraniteľnosť uzavrie iba aktualizácia. Zablokované funkcie však môžu po úspešnom zneužití obmedziť manévrovací priestor útočníka.

**Prečo php -i zobrazuje iný zoznam než môj web?**  
Príkazový riadok často číta vlastnú php.ini. Pre web platí konfigurácia PHP-FPM, mod_php alebo LiteSpeed. Hodnotu preto kontrolujte v prevádzkovom režime, v ktorom beží váš web.

**Ktoré aplikácie potrebujú proc_open alebo exec?**  
Závisí to od aplikácie. Typické sú úprava obrázkov cez externé programy, tvorba PDF, odosielanie pošty cez sendmail alebo nástroje ako Composer. Preverte to v kóde a v systémových požiadavkách výrobcu.

## Zdroje

- [php.net: bezpečnostné hlásenia](https://www.php.net/)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
- [BSI IT-Grundschutz](https://www.bsi.bund.de/DE/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/IT-Grundschutz/it-grundschutz_node.html)
