Praegune olukord: PHP2Shell. Kaks kriitilist PHP turvaauku (CVSS 9,2) lubavad kahjulikku koodi ilma sisselogimata. Paigad alates 21.10.2026.Mida nüüd teha →

display_errors off: veaväljundi väljalülitamine tootmiskeskkonnas

Nähtavad PHP veateated reedavad teid, andmebaasinimesid ja versioone. Nii lülitate need välja PHP-s, raamistikus ja veebiserveris, vigu silmist kaotamata.

Seis Lugemisaeg 5 minKarastamine ja seadistus

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.

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

; 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. Täieliku põhikonfiguratsiooni leiate juhendist php.ini turvaline seadistamine.

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.

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

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

Kohene kontakt

Iga tund loeb. Kirjutage meile kohe.

Kirjeldage lühidalt süsteemi, PHP versiooni ja tähelepanekut. Võtame teiega ühendust, selgitame olukorra välja ja töötame kaugtööna, kuni intsident on lõpetatud ja dokumenteeritud.

Kohene abi