Sitwazzjoni attwali: PHP2Shell. Żewġ vulnerabbiltajiet kritiċi ta' PHP (CVSS 9,2) jippermettu kodiċi malizzjuż mingħajr login. Patches mill-21/10/2026.X'għandu jsir issa →

Żbalji u exceptions f'PHP

PHP jaf kemm messaġġi klassiċi ta' żball kif ukoll exceptions. Din il-paġna tispjega l-ġerarkija Throwable, immaniġġjar nadif tal-iżbalji, issettjar sigur għall-produzzjoni u l-miżura ta' PHP2Shell dwar fatal_error_backtraces.

Stat 5 min. qariGħarfien dwar PHP

Fil-qosor: PHP jirrapporta problemi b'żewġ modi: bħala żbalji klassiċi bħal twissijiet u noti, ikkontrollati permezz ta' error_reporting, u bħala exceptions li jistgħu jinqabdu b'try u catch. Minn PHP 7 il-quddiem, ħafna żbalji interni jitfgħu wkoll oġġett tal-klassi Error; flimkien ma' Exception jimplimenta l-interface Throwable. Fil-produzzjoni japplika: l-iżbalji jiġu rreġistrati, qatt murija fil-browser. Fuq PHP 8.5, minħabba PHP2Shell, fatal_error_backtraces=0 jagħmel parti wkoll mill-miżuri temporanji.

Żewġ dinjiet: żbalji klassiċi u exceptions

PHP joriġina minn żmien meta l-iżbalji kienu jinħarġu l-aktar bħala messaġġ: noti (E_NOTICE), twissijiet (E_WARNING), funzjonijiet skaduti (E_DEPRECATED) u żbalji fatali (E_ERROR). Ħafna minn dawn il-messaġġi jħallu l-iskript ikompli, spiss b'data żbaljata jew vojta.

L-exceptions jaħdmu b'mod differenti. Jinterrompu l-fluss normali u jaqbżu għall-blokk catch li jaqbel li jmiss. Jekk ma jinstab l-ebda wieħed, l-iskript jintemm. Għal min jieħu d-deċiżjonijiet id-differenza hija importanti: twissija siekta tista' twassal biex ordni tinħażen mhux kompluta mingħajr ma jinduna ħadd. Exception tagħmel il-problema viżibbli u jista' jiġi mmaniġġjat.

Benefiċċju sottovalutat tal-messaġġi klassiċi huma n-noti tat-tip E_DEPRECATED. Dawn jħabbru li mezz tal-lingwa jitneħħa f'verżjoni futura ta' PHP. Min jiġborhom fil-log u jevalwahom regolarment, jaf qabel upgrade liema postijiet jeħtieġu aġġustament, u fil-każ ta' vulnerabbiltà urġenti tas-sigurtà ma jkollux għalfejn jittestja fit-tul l-ewwel.

Il-ġerarkija Throwable

Dak kollu li jista' jintefa' b'throw u jinqabad b'catch jimplimenta Throwable. Taħtu hemm żewġ friegħi:

Klassi Skop Eżempji ta' subklassijiet
Exception żbalji prevedibbli tal-applikazzjoni u tal-estensjonijiet ErrorException, PDOException, klassijiet proprji
Error żbalji interni ta' PHP TypeError, ValueError, ArgumentCountError, ArithmeticError, DivisionByZeroError, UnhandledMatchError

Klassijiet proprji ta' żbalji jiddiskendu minn Exception, mhux minn Error. Minn PHP 8.0 il-biċċa l-kbira tal-funzjonijiet interni, f'każ ta' parametri invalidi, jitfgħu TypeError jew ValueError, minflok ma joħorġu biss twissija. strlen([]) huwa każ bħal dan.

try, catch u finally fil-prattika

<?php
declare(strict_types=1);

final class ZahlungFehlgeschlagen extends RuntimeException {}

function bezahlen(Bestellung $b, Zahlungsdienst $dienst, LoggerInterface $log): bool
{
    try {
        $dienst->belasten($b->betrag(), $b->referenz());
        return true;
    } catch (ZahlungFehlgeschlagen $e) {
        $log->warning('Zahlung abgelehnt', ['bestellung' => $b->id(), 'exception' => $e]);
        return false;
    } catch (TimeoutException | VerbindungsFehler) {
        // minn PHP 8.0 il-varjabbli fil-catch hija fakultattiva
        $log->error('Zahlungsdienst nicht erreichbar', ['bestellung' => $b->id()]);
        return false;
    } finally {
        $dienst->verbindungSchliessen();
    }
}

Diversi klassijiet jistgħu jingħaqdu f'catch wieħed b'|. Il-blokk finally dejjem jaħdem, kemm jekk seħħ żball kif ukoll jekk le. Minn PHP 8.0 throw huwa wkoll espressjoni u jista' jidher pereżempju wara ??: $id = $_GET['id'] ?? throw new InvalidArgumentException('id fehlt');.

Handlers globali: set_error_handler u set_exception_handler

Żewġ funzjonijiet jaqbdu dak li altrimenti jgħaddi. set_exception_handler() jirreġistra funzjoni għal Throwables li ma nqabdux. Skont il-manwal l-iskript jintemm wara li titqabbad; għalhekk tajba għar-reġistrazzjoni u għal paġna newtrali tal-iżbalji, mhux biex titkompla x-xogħol.

Handler li kiteb l-iżball sħiħ fil-log b'ħin u b'identifikatur każwali, u juri lill-viżitatur biss paġna newtrali b'dan l-identifikatur, ħadem tajjeb fil-prattika. L-appoġġ imbagħad jista' jsib il-każ mill-ġdid fil-log mingħajr ma dettalji interni jaslu 'l barra.

set_error_handler() jaqbad żbalji klassiċi. Il-manwal juri kif jinbidlu f'ErrorException, biex it-twissijiet jiġu mmaniġġjati bħal exceptions:

<?php
set_error_handler(function (int $nr, string $text, string $datei, int $zeile): bool {
    if (!(error_reporting() & $nr)) {
        return false; // eskluż minn error_reporting
    }
    if ($nr === E_DEPRECATED || $nr === E_USER_DEPRECATED) {
        return false; // ma tiskalax noti dwar dak li huwa skadut
    }
    throw new ErrorException($text, 0, $nr, $datei, $zeile);
});

Żbalji fatali bħal overflow tal-memorja ma jistgħux jinqabdu b'dan il-mod. X'jiġri ġewwa f'overflow tispjegah il-paġna memory_limit u Out-of-Memory.

Konfigurazzjoni tal-wiri tal-iżbalji u tar-reġistrazzjoni

L-aktar issettjar importanti bil-valuri standard tagħhom skont il-manwal:

Issettjar Standard Rakkomandazzjoni għall-produzzjoni
error_reporting E_ALL minn PHP 8.0.0 E_ALL
display_errors 1 Off
display_startup_errors 1 minn PHP 8.0.0 Off
log_errors 0 On
error_log vojt (log tas-server tal-web jew tas-SAPI) fajl proprju barra mill-webroot
fatal_error_backtraces 1, ġdid f'PHP 8.5.0 temporanjament 0 (PHP2Shell)

Minn PHP 8.2.0 error_log_mode jistabbilixxi d-drittijiet tal-fajl tal-log, b'mod awtomatiku 0644. Jekk il-logs fihom data personali jew mogħdijiet, valur aktar strett għandu sens, biex utenti oħra fuq is-server ma jkunux jistgħu jaqrawhom. B'ignore_repeated_errors messaġġi identiċi mill-istess fajl u linja jistgħu jingħaqdu, biex ċiklu ta' żbalji ma jgħarraqx il-log.

Il-php.ini-production mogħti flimkien diġà jissettja display_errors fuq Off. Skont il-manwal ini_set('display_errors', ...) waqt it-tħaddim ma jaffettwax żbalji fatali, u żbalji ta' sintassi jidhru qabel ma jaħdem xi ini_set(). Għalhekk dawn il-valuri jappartjenu fil-konfigurazzjoni tas-server. L-isfond jinsab fl-artikolu Itfi l-wiri tal-iżbalji fil-produzzjoni; kif il-logs jinżammu mingħajr tnixxija ta' data, fl-artikolu Reġistrazzjoni sigura.

Immaniġġjar tal-iżbalji u PHP2Shell

Għal PHP 8.5 php.net isemmi bħala waħda mill-miżuri temporanji kontra PHP2Shell li jiġi ssettjat fatal_error_backtraces=0 u li PHP jerġa' jinbeda wara. Il-miżuri l-oħra jirrigwardaw memory_limit, post_max_size u session.upload_progress.enabled. L-ebda waħda minnhom ma tieħu post l-aġġornament għal PHP 8.5.12, 8.4.27, 8.3.36 jew 8.2.35.

; PHP 8.5 biss, f'php.ini jew fil-pool ta' FPM, wara erġgħu ibdew il-workers kollha
fatal_error_backtraces = 0

Il-logs tal-iżbalji huma wkoll evidenza importanti wara PHP2Shell. Jekk mill-20 ta' Ottubru 2026 jaqbżu żbalji tal-memorja jew workers interrotti, dan jista' jindika tentattivi ta' attakk, imma jista' jkollu wkoll kawżi bla ħsara. Żommu l-logs u evalwawhom flimkien mal-logs tal-aċċess, kif deskritt fil-gwida Evalwazzjoni tal-logs tas-server tal-web wara attakk.

Kif jgħin PHP SOS konkretament?

  • Niċċekkjaw l-issettjar effettiv għall-wiri tal-iżbalji u għar-reġistrazzjoni għal kull websajt u nsettjawh b'mod adattat għall-produzzjoni.
  • Napplikaw il-miżuri temporanji ta' PHP2Shell skont il-verżjoni ta' PHP u nerġgħu nibdew il-workers kollha.
  • Nissalvaw il-logs tal-iżbalji u tal-aċċess mill-20 ta' Ottubru 2026 u nevalwawhom għal anomaliji.
  • Bħala parti mill-Monitoraġġ tas-sigurtà nirrappurtaw akkumulazzjonijiet mhux tas-soltu ta' żbalji, minflok inħalluhom jisparixxu fil-log.

Mistoqsijiet frekwenti

X'inhi d-differenza bejn Error u Exception?

It-tnejn jimplimentaw l-interface Throwable. Exception hija maħsuba għal żbalji li applikazzjoni tistenna u timmaniġġja, pereżempju konnessjoni falluta mad-database. Error tirrappreżenta żbalji interni ta' PHP bħal TypeError jew diviżjoni b'żero.

Għandu display_errors ikun mixgħul fil-produzzjoni?

Le. Messaġġi ta' żball fil-browser iżvelaw mogħdijiet, mistoqsijiet u xi drabi data ta' aċċess. Fil-produzzjoni display_errors għandu jkun Off u log_errors On, biex l-iżbalji jispiċċaw fil-log minflok għand il-viżitatur.

Jista' jinqabad bi try/catch overflow tal-memorja?

Le. Jekk skript jaqbeż memory_limit, PHP jtemmu b'żball fatali li ma jistax jinqabad bħala exception. Jidher biss fil-log tal-iżbalji, sakemm log_errors ikun attiv.

X'inhi fatal_error_backtraces?

Issettjar li jeżisti minn PHP 8.5.0 u li jżid backtrace ma' żbalji fatali. Hija attiva b'mod awtomatiku. Bħala miżura temporanja kontra PHP2Shell, php.net jissuġġerixxi għal PHP 8.5 li tiġi ssettjata fuq 0 u li PHP jerġa' jinbeda wara.

Sorsi

Kuntatt immedjat

Kull siegħa tgħodd. Iktbu lilna issa.

Iddeskrivu fil-qosor is-sistema, il-verżjoni ta' PHP u dak li osservajtu. Nikkuntattjawkom, niċċaraw is-sitwazzjoni u naħdmu mill-bogħod sakemm l-inċident jingħalaq u jiġi ddokumentat.

Għajnuna immedjata