Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

display_errors off: vypnutie chybových výstupov v produkcii

Viditeľné chybové hlásenia PHP prezrádzajú cesty, názvy databáz a verzie. Takto ich vypnete v PHP, vo frameworku a vo webovom serveri bez straty prehľadu o chybách.

Stav 5 min čítaniaHardening a konfigurácia

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.

; 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:

; 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. Úplnú základnú konfiguráciu nájdete pri Bezpečná konfigurácia php.ini.

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.

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.
# 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.

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 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

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc