# display_errors off: vypnutie chybových výstupov v produkcii

> display_errors Off a viac: ktoré nastavenia PHP držia chybové hlásenia mimo živého webu, čo pridávajú frameworky a ako overiť úniky informácií.

Zdroj: https://phpsos.de/sk/blog/display-errors-produktion/  
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:** Na živom webe patrí `display_errors = Off` do php.ini, spolu s `display_startup_errors = Off`, `log_errors = On` a chybovým protokolom mimo webového koreňa. Dodatočne musia CMS a frameworky bežať v produkčnom režime, inak podrobnosti zobrazujú ich vlastné chybové stránky. Ak je hodnota zablokovaná pomocou `php_admin_flag` a po každej aktualizácii overená, chyby zostanú v protokole namiesto v prehliadači.

## Čo prezradí jediné chybové hlásenie

Upozornenie na hornom okraji stránky, „Fatal error“ namiesto prehľadu objednávky: také výstupy vyzerajú neškodne. Pre útočníka sú mapou. Ukazujú úplné cesty k súborom, názvy databáz a tabuliek, použité knižnice a často aj verziu PHP.

Práve v situáciách ako PHP2Shell, keď sa masovo hľadajú zraniteľné servery, by mal server o sebe prezrádzať čo najmenej. Tým sa neuzavrie žiadna zraniteľnosť v interpreteri PHP, ale sťaží sa každý ďalší krok po vlámaní a cielené útoky na vašu aplikáciu sú namáhavejšie.

K tomu pribúda ochrana údajov. Chybové hlásenia môžu obsahovať časti požiadaviek, napríklad e-mailové adresy z formulárov. Čo sa zobrazí v prehliadači návštevníka, už nie je pod vašou kontrolou.

## Štandardné hodnoty nie sú určené pre produkciu

Mnohí predpokladajú, že PHP chyby samo skrýva. Príručka PHP hovorí niečo iné: vstavaná štandardná hodnota `display_errors` je 1 a `display_startup_errors` je od PHP 8.0 tiež štandardne zapnuté. Až dodávaná šablóna `php.ini-production` nastavuje oboje na Off. Príručka označuje `display_errors` výslovne za vývojovú funkciu, ktorú by sa na systémoch v internete nikdy nemalo používať.

Či váš server používa produkčnú šablónu, nie je samozrejmé. Obrazy kontajnerov sa niekedy spúšťajú úplne bez php.ini, hostingové panely nastavujú vlastné hodnoty a po presťahovaní sa rado skopíruje vývojová šablóna.

## display_errors off: prehľad nastavení

Nasledujúce hodnoty sú pre produkčné servery zmysluplné. Konštanty ako `E_ALL` fungujú len v php.ini; v konfigurácii Apache nemajú podľa príručky PHP význam a musia sa uviesť ako číslo.

| Nastavenie | Produkcia | Účel |
|---|---|---|
| `display_errors` | `Off` | žiadne chyby v prehliadači |
| `display_startup_errors` | `Off` | žiadne chyby pri štarte PHP vo výstupe |
| `log_errors` | `On` | chyby zapisovať do protokolu |
| `error_log` | cesta mimo webového koreňa | vlastný súbor protokolu pre každý web alebo pool |
| `error_reporting` | `E_ALL` | všetky chyby zapisovať do protokolu, nezobrazovať |
| `html_errors` | `Off` | čistý text namiesto HTML v protokoloch |
| `zend.exception_ignore_args` | `On` | žiadne argumenty funkcií v stack trace |
| `fatal_error_backtraces` | `0` do aktualizácie (len PHP 8.5) | prechodné opatrenie podľa php.net |

`zend.exception_ignore_args` je obzvlášť cenné. Bez tohto nastavenia môžu stack trace v protokoloch a na chybových stránkach obsahovať argumenty volaní funkcií, teda aj heslá alebo tokeny, ktoré sa práve spracúvali.

```ini
; php.ini webového SAPI
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/website-fehler.log
error_reporting = E_ALL
html_errors = Off
zend.exception_ignore_args = On
; len PHP 8.5, prechodné opatrenie do aktualizácie na 8.5.12:
; fatal_error_backtraces = 0
```

V poole FPM zablokujte najdôležitejšie hodnoty dodatočne, aby ich žiadna aplikácia cez `ini_set()` znova nezapla:

```ini
; napr. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[display_errors] = off
php_admin_flag[display_startup_errors] = off
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php/seite1-fehler.log
```

Potom reštartujte príslušnú službu PHP. Ako presne funguje blokovanie, vysvetľuje príspevok [php_admin_value: zablokovanie nastavení proti prepísaniu](https://phpsos.de/sk/blog/php-admin-value-sperren/). Úplnú základnú konfiguráciu nájdete pri [Bezpečná konfigurácia php.ini](https://phpsos.de/sk/ratgeber/php-ini-sicher-konfigurieren/).

## Druhý vypínač: ladiaci režim aplikácie

PHP je len polovica úlohy. Moderné frameworky chyby zachytávajú samy a zobrazujú vlastné, často veľmi podrobné chybové stránky. V ladiacom režime obsahujú úryvky zdrojového kódu, hodnoty konfigurácie a niekedy aj premenné prostredia. Tieto stránky sa zobrazujú aj vtedy, keď je `display_errors` v PHP vypnuté.

Preto pre každú aplikáciu skontrolujte jej vlastný vypínač. Pri WordPresse sú to `WP_DEBUG` a `WP_DEBUG_DISPLAY` v súbore `wp-config.php`, pri Laravel a Symfony `APP_DEBUG` a prostredie v súbore `.env`, pri iných systémoch produkčný režim podľa dokumentácie výrobcu. Na živom systéme patrí ladiaci režim trvalo vypnutý, aj „len na chvíľu na test“ je riziko.

Ako sa chyby v aplikácii čisto spracúvajú, namiesto aby sa potláčali, opisuje [Chyby a výnimky v PHP](https://phpsos.de/sk/php/fehler-und-exceptions/).

## Ako nájdete chybové výstupy skôr, než ich nájdu iní

Jednorazové nastavenie nestačí. Chybové výstupy sa po aktualizáciách, presťahovaniach alebo zmenách panela vracajú. Pomáha krátky postup kontroly:

1. Účinné hodnoty overiť vo webovom kontexte, nielen na príkazovom riadku, napríklad pomocou nakrátko uloženého a potom okamžite zmazaného kontrolného súboru.
2. Ladiaci režim každej aplikácie skontrolovať v jej konfiguračnom súbore.
3. Doručené stránky prehľadať na typické texty chýb, ako v bloku kódu nižšie.
4. Vo vyhľadávači pomocou dopytu `site:` na vašu doménu hľadať výrazy ako „Fatal error“ alebo „Warning“.
5. Overiť, či sa do chybového protokolu zapisuje a či neleží vo webovom koreni.

```bash
# Prehľadať doručené stránky na texty chýb PHP (len vlastné domény)
for url in https://www.example.de/ https://www.example.de/kontakt/; do
  curl -s "$url" | grep -E -o "(Fatal error|Warning|Notice|Deprecated|Stack trace)[^<]{0,80}" | head -3
done
# Zapisuje sa do chybového protokolu?
ls -l /var/log/php/
```

> **Dôležité:**
> Skrývanie chýb nenahrádza ich odstránenie. Protokol plný upozornení je znakom potreby údržby a po vlámaní je často dôležitou stopou. Čo pritom zapisujete do protokolu a čo nie, opisuje [Bezpečné protokolovanie: zapisovanie chýb bez úniku údajov](https://phpsos.de/sk/blog/sicher-loggen-php/).

## Záver: ticho v prehliadači, hovorne v protokole

Pravidlo pre produkčné servery je jednoduché: chyby patria do protokolu, nie na web. V praxi zlyháva na štandardných hodnotách, ktoré nie sú určené pre produkciu, na ladiacich vypínačoch v aplikáciách a na konfiguráciách, ktoré po aktualizáciách alebo presťahovaniach spadnú späť.

Kto vypne `display_errors` a `display_startup_errors`, zablokuje hodnoty v poole, skontroluje ladiaci režim aplikácie a výsledok pravidelne overuje, uzavrie jeden z najčastejších zdrojov zbytočného prezrádzania informácií. Námaha je malá, účinok vydrží, kým je kontrola súčasťou každej aktualizácie.

Jeden bod by pritom nemal zapadnúť: chybový protokol nie je odpadkový kôš. Kto ho pravidelne číta, rozpozná chybné aktualizácie, zastarané funkcie a niekedy aj prvé stopy útoku, dlho predtým, než si niečo všimnú zákazníci.

## Ako konkrétne pomáha PHP SOS?

- **Preveriť:** vyčítame účinné nastavenia chýb pre každý web a pool a doručené stránky prehľadáme na chybové výstupy.
- **Prestaviť:** nastavenia PHP a aplikácií nastavíme pre produkčnú prevádzku a zablokujeme ich proti prepísaniu.
- **Zriadiť protokoly:** chybové protokoly ležia mimo webového koreňa, rotujú sa a sú prístupné vašim vývojárom.
- **Udržať trvalo:** v rámci [zmluvy o bezpečnostnej údržbe](https://phpsos.de/sk/leistungen/security-wartungsvertrag/) nastavenia po každej aktualizácii znova preveríme.


## Časté otázky

**Nie je display_errors v PHP aj tak vypnuté?**  
Nie automaticky. Podľa príručky PHP je vstavaná štandardná hodnota display_errors 1. Až dodávaná šablóna php.ini-production nastavuje Off. Či váš server túto šablónu používa, závisí od distribúcie, panela alebo obrazu kontajnera a malo by sa to overiť.

**Stačí display_errors = Off, ak WordPress alebo Laravel bežia v ladiacom režime?**  
Nie. Mnohé CMS a frameworky prinášajú vlastné chybové stránky, ktoré môžu zobrazovať podrobnosti nezávisle od PHP. Vypnite preto aj ladiaci režim aplikácie, napríklad WP_DEBUG_DISPLAY pri WordPresse alebo APP_DEBUG pri Laravel a Symfony.

**Kam idú chyby, ak sa už nezobrazujú?**  
S log_errors = On ich PHP zapisuje do súboru, ktorý určuje error_log, alebo do protokolu príslušného spôsobu prevádzky, napríklad do chybového protokolu Apache alebo PHP-FPM. Súbor by mal ležať mimo webového koreňa a mal by sa pravidelne rotovať.

**Čo má fatal_error_backtraces spoločné s PHP2Shell?**  
Nastavenie existuje od PHP 8.5 a je štandardne aktívne. php.net uvádza fatal_error_backtraces=0 s následným reštartom ako jedno z prechodných opatrení pre PHP 8.5, kým aktualizácia na 8.5.12 ešte chýba. Aktualizáciu nenahrádza.

## Zdroje

- [Príručka PHP: spracovanie chýb a zapisovanie do protokolu](https://www.php.net/manual/en/errorfunc.configuration.php)
- [Príručka PHP: zmena konfigurácie (php_admin_flag)](https://www.php.net/manual/en/configuration.changes.php)
- [php.net: bezpečnostné správy](https://www.php.net/)
- [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/)
