# display_errors off: veaväljundi väljalülitamine tootmiskeskkonnas

> display_errors Off ja enam: millised PHP sätted hoiavad veateated töötavast veebisaidist eemal, mida raamistikud lisavad ja kuidas lekkeid kontrollida.

Allikas: https://phpsos.de/et/blog/display-errors-produktion/  
Seis: 25.10.2026  
Pakkuja: PHP SOS, PHP hädaabi ja serveri turvalisus. Kohene abi WhatsAppis: https://wa.me/491736494914?text=Tere%2C%20PHP%20SOS%2C%20vajame%20abi%20oma%20PHP-serveriga.%20Ettev%C3%B5te%3A%20%E2%80%A6%20Veebisait%3A%20%E2%80%A6

**Lühidalt:** Töötaval veebisaidil kuulub `display_errors = Off` faili php.ini, koos sätetega `display_startup_errors = Off`, `log_errors = On` ja vealogiga väljaspool veebijuurkataloogi. Lisaks peavad CMS-id ja raamistikud töötama tootmisrežiimis, muidu näitavad nende oma vealehed üksikasju. Lukustatuna käsuga `php_admin_flag` ja pärast iga uuendust kontrollituna jäävad vead logisse, mitte brauserisse.

## Mida üksainus veateade reedab

Hoiatus lehe ülaservas, „Fatal error“ tellimuse ülevaate asemel: sellised väljundid näevad kahjutud välja. Ründajale on need kaart. Need näitavad täielikke failiteid, andmebaaside ja tabelite nimesid, kasutatud teeke ja sageli PHP versiooni.

Just PHP2Shelli-laadsetes olukordades, kus haavatavaid servereid otsitakse massiliselt, peaks server enda kohta võimalikult vähe avaldama. See ei sulge ühtegi auku PHP interpretaatoris, kuid raskendab igat edasist sammu pärast sissemurdmist ja teeb sihipärased rünnakud teie rakenduse vastu vaevalisemaks.

Lisaks tuleb andmekaitse. Veateated võivad sisaldada päringute osi, näiteks vormidest pärit e-posti aadresse. Mis ilmub külastaja brauserisse, ei ole enam teie kontrolli all.

## Vaikeväärtused ei ole mõeldud tootmiseks

Paljud eeldavad, et PHP peidab vead ise. PHP käsiraamat ütleb teisiti: `display_errors` sisseehitatud vaikeväärtus on 1 ja `display_startup_errors` on alates PHP 8.0-st samuti vaikimisi sisse lülitatud. Alles kaasasolev mall `php.ini-production` seab mõlemad väärtusele Off. Käsiraamat nimetab `display_errors`-i otsesõnu arendusfunktsiooniks, mida ei tohiks kunagi internetiga ühendatud süsteemides kasutada.

Kas teie server kasutab tootmismalli, ei ole iseenesestmõistetav. Konteinerikujutised käivituvad osaliselt hoopis ilma php.ini-ta, majutuspaneelid seavad oma väärtused ja pärast kolimist kopeeritakse meelsasti arendusmall.

## display_errors off: sätete ülevaade

Järgmised väärtused on tootmisserverite jaoks mõistlikud. Konstandid nagu `E_ALL` töötavad ainult failis php.ini; Apache'i konfiguratsioonis ei ole neil PHP käsiraamatu järgi tähendust ja need tuleb anda arvuna.

| Säte | Tootmine | Eesmärk |
|---|---|---|
| `display_errors` | `Off` | vigu brauseris ei ole |
| `display_startup_errors` | `Off` | PHP käivitamise vigu väljundis ei ole |
| `log_errors` | `On` | kirjutada vead protokolli |
| `error_log` | tee väljaspool veebijuurkataloogi | oma logifail veebisaidi või pooli kohta |
| `error_reporting` | `E_ALL` | logida kõik vead, mitte kuvada |
| `html_errors` | `Off` | protokollides lihttekst HTML-i asemel |
| `zend.exception_ignore_args` | `On` | funktsiooniargumente stacktrace'ides ei ole |
| `fatal_error_backtraces` | `0` kuni uuenduseni (ainult PHP 8.5) | üleminekumeede php.net'i järgi |

`zend.exception_ignore_args` on eriti väärtuslik. Ilma selle sättata võivad logide ja vealehtede stacktrace'id sisaldada funktsioonikutsete argumente, seega ka paroole või tokeneid, mida parajasti töödeldi.

```ini
; Veebi-SAPI php.ini
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
; ainult PHP 8.5, üleminekumeede kuni uuenduseni versioonile 8.5.12:
; fatal_error_backtraces = 0
```

FPM-poolis lukustate olulisemad väärtused lisaks, et ükski rakendus neid käsuga `ini_set()` uuesti sisse ei lülitaks:

```ini
; nt /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
```

Seejärel taaskäivitage vastav PHP teenus. Kuidas lukustamine täpselt töötab, selgitab artikkel [php_admin_value: sätete kaitsmine ülekirjutamise eest](https://phpsos.de/et/blog/php-admin-value-sperren/). Täieliku põhikonfiguratsiooni leiate juhendist [php.ini turvaline seadistamine](https://phpsos.de/et/ratgeber/php-ini-sicher-konfigurieren/).

## Teine lüliti: rakenduse silumisrežiim

PHP on vaid pool võitu. Kaasaegsed raamistikud püüavad vead ise kinni ja näitavad oma, sageli väga põhjalikke vealehti. Silumisrežiimis sisaldavad need lähtekoodi väljavõtteid, konfiguratsiooniväärtusi ja vahel keskkonnamuutujaid. Need lehed ilmuvad ka siis, kui `display_errors` on PHP-s välja lülitatud.

Kontrollige seetõttu iga rakenduse oma lülitit. WordPressis on need `WP_DEBUG` ja `WP_DEBUG_DISPLAY` failis `wp-config.php`, Laravelis ja Symfonys `APP_DEBUG` ja keskkond failis `.env`, teistes süsteemides tootmisrežiim tootja dokumentatsiooni järgi. Töötavas süsteemis peab silumisrežiim olema püsivalt väljas, ka „ainult hetkeks testimiseks“ on risk.

Kuidas vigu rakenduses puhtalt käsitleda, selle asemel et neid maha suruda, kirjeldab [Vead ja erandid PHP-s](https://phpsos.de/et/php/fehler-und-exceptions/).

## Nii leiate veaväljundi enne, kui teised seda teevad

Ühekordne seadistamine ei piisa. Veaväljund naaseb pärast uuendusi, kolimisi või paneeli muudatusi. Lühike kontrolliprotsess aitab:

1. Kontrollige kehtivaid väärtusi veebikontekstis, mitte ainult käsureal, näiteks korraks pandud ja seejärel kohe kustutatud kontrollfailiga.
2. Kontrollige iga rakenduse silumisrežiimi selle konfiguratsioonifailis.
3. Otsige väljastatud lehtedest tüüpilisi veatekste, nagu allpool koodiplokis.
4. Otsige otsingumootoris `site:`-päringuga oma domeenile sõnu nagu „Fatal error“ või „Warning“.
5. Kontrollige, kas vealogisse kirjutatakse ja kas see ei asu veebijuurkataloogis.

```bash
# Otsige väljastatud lehtedest PHP veatekste (ainult oma domeenid)
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
# Kas vealogisse kirjutatakse?
ls -l /var/log/php/
```

> **Oluline:**
> Vigade peitmine ei asenda nende parandamist. Hoiatusi täis logi on märk hooldusvajadusest ja pärast sissemurdmist sageli oluline jälg. Mida seejuures logida ja mida mitte, kirjeldab [Turvaline logimine: vigade protokollimine ilma andmelekketa](https://phpsos.de/et/blog/sicher-loggen-php/).

## Kokkuvõte: vaikselt brauseris, jutukalt logis

Reegel tootmisserverite jaoks on lihtne: vead kuuluvad protokolli, mitte veebisaiti. Praktikas jääb see ellu viimata vaikeväärtuste taha, mis ei ole mõeldud tootmiseks, rakenduste silumislülitite taha ja konfiguratsioonide taha, mis langevad pärast uuendusi või kolimisi tagasi.

Kes lülitab `display_errors` ja `display_startup_errors` välja, lukustab väärtused poolis, kontrollib rakenduse silumisrežiimi ja kontrollib tulemust korrapäraselt, sulgeb ühe sagedaseima tarbetu infoavalikustamise allika. Vaev on väike, mõju püsib seni, kuni kontroll jääb iga uuenduse osaks.

Üks punkt ei tohiks seejuures ära kaduda: vealogi ei ole prügikast. Kes seda korrapäraselt loeb, tunneb ära ebaõnnestunud uuendused, aegunud funktsioonid ja vahel ka rünnaku esimesed jäljed, kaua enne, kui kliendid midagi märkavad.

## Kuidas PHP SOS konkreetselt aitab?

- **Kontrollida:** loeme välja kehtivad veasätted veebisaidi ja pooli kaupa ning otsime väljastatud lehtedest veaväljundit.
- **Ümber seadistada:** seame PHP ja rakenduse sätted tootmistööks ning lukustame need ülekirjutamise vastu.
- **Seadistada protokollid:** vealogid asuvad väljaspool veebijuurkataloogi, neid roteeritakse ja need on teie arendajatele kättesaadavad.
- **Hoida püsivalt:** [turvahooldusleppe](https://phpsos.de/et/leistungen/security-wartungsvertrag/) raames kontrollime sätteid pärast iga uuendust uuesti.


## Korduma kippuvad küsimused

**Kas display_errors pole PHP-s niikuinii välja lülitatud?**  
Mitte automaatselt. PHP käsiraamatu järgi on display_errors sisseehitatud vaikeväärtus 1. Alles kaasasolev mall php.ini-production seab väärtuseks Off. Kas teie server seda malli kasutab, sõltub distributsioonist, paneelist või konteinerikujutisest ja seda tuleks kontrollida.

**Kas display_errors = Off piisab, kui WordPress või Laravel töötavad silumisrežiimis?**  
Ei. Paljud CMS-id ja raamistikud toovad kaasa oma vealehed, mis võivad PHP-st sõltumatult üksikasju näidata. Lülitage seetõttu välja ka rakenduse silumisrežiim, näiteks WP_DEBUG_DISPLAY WordPressis või APP_DEBUG Laravelis ja Symfonys.

**Kuhu vead lähevad, kui neid enam ei kuvata?**  
Sättega log_errors = On kirjutab PHP need faili, mille nimetab error_log, või vastava töörežiimi protokolli, näiteks Apache'i või PHP-FPM-i vealogisse. Fail peaks asuma väljaspool veebijuurkataloogi ja seda tuleks korrapäraselt roteerida.

**Mis pistmist on fatal_error_backtraces'il PHP2Shelliga?**  
Säte on olemas alates PHP 8.5-st ja on vaikimisi aktiivne. php.net nimetab fatal_error_backtraces=0 koos järgneva taaskäivitusega üheks PHP 8.5 üleminekumeetmeks, kuni uuendus versioonile 8.5.12 on veel ootel. See ei asenda uuendust.

## Allikad

- [PHP käsiraamat: veakäsitlus ja logimine](https://www.php.net/manual/en/errorfunc.configuration.php)
- [PHP käsiraamat: konfiguratsiooni muutmine (php_admin_flag)](https://www.php.net/manual/en/configuration.changes.php)
- [php.net: turvateated](https://www.php.net/)
- [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/)
