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 →

Namespaces u autoloading (PSR-4)

In-namespaces jorganizzaw il-kodiċi PHP, l-autoloading jgħabbi l-klassijiet eżatt meta jkunu meħtieġa. Hawn tarawh kif PSR-4 jimmappja l-ismijiet tal-klassijiet fuq fajls u għaliex l-autoloader irid jiġi vverifikat wara inċident.

Stat 5 min. qariGħarfien dwar PHP

Fil-qosor: In-namespaces f'PHP huma xi ħaġa bħal folders għall-ismijiet tal-klassijiet: App\Rechnung\Pdf u Bibliothek\Pdf jistgħu jeżistu flimkien mingħajr ma jiddisturbaw lil xulxin. L-autoloading jiżgura li PHP jgħabbi klassi biss meta tkun meħtieġa għall-ewwel darba. L-istandard PSR-4 jistabbilixxi kif minn isem ta' klassi ssir mogħdija ta' fajl; Composer imbagħad jiġġenera l-autoloader xieraq. Peress li dan l-autoloader jaħdem ma' kull talba, jagħmel parti mill-ewwel affarijiet li jiġu vverifikati wara inċident tas-sigurtà.

Għaliex PHP jeħtieġ namespaces

In-namespaces jeżistu minn PHP 5.3.0. Qabel, il-klassijiet u l-funzjonijiet kollha kienu jaqsmu spazju wieħed globali tal-ismijiet. Jekk żewġ libreriji kienu jissejħu Logger, kien jiġri kollass. L-iżviluppaturi kienu jgħinu lilhom infushom b'ismijiet twal bħal Firma_Modul_Unterbereich_Logger.

Il-manwal ta' PHP isemmi żewġ problemi li jsolvu n-namespaces: kolliżjonijiet tal-ismijiet bejn kodiċi proprju, klassijiet interni ta' PHP u libreriji ta' terzi, kif ukoll ismijiet twal żżejjed li nħolqu biss biex jiġu evitati dawn il-kolliżjonijiet. Għal min jieħu d-deċiżjonijiet dan ifisser: biss in-namespaces għamluha prattikabbli li jinġabru għexieren ta' pakketti barranin fi proġett wieħed, kif illum huwa komuni b'Composer.

Namespaces fil-prattika: namespace, use, aliases

Fajl jiddikjara n-namespace tiegħu fl-ewwel istruzzjoni. B'use wieħed iġib klassijiet minn namespaces oħra, jekk irid taħt isem iqsar.

<?php
declare(strict_types=1);

namespace App\Rechnung;

use App\Kunde\Kunde;
use Psr\Log\LoggerInterface as Log;

final class PdfErzeuger
{
    public function __construct(private Log $log) {}

    public function erzeugen(Kunde $kunde): string
    {
        $this->log->info('PDF erzeugt', ['kunde' => $kunde->id]);
        return \sprintf('Rechnung für %s', $kunde->name);
    }
}

L-isem sħiħ ta' din il-klassi huwa App\Rechnung\PdfErzeuger. Il-backslash fil-bidu ta' \sprintf jirreferi espliċitament għall-funzjoni globali ta' PHP.

Autoloading: tagħbija tal-klassijiet meta jkun hemm bżonn

Mingħajr autoloading kull skript kellu jinkludi l-fajls kollha meħtieġa b'require. Minflok, b'spl_autoload_register() wieħed jirreġistra funzjoni li PHP isejjaħ hekk kif tintuża klassi, interface, trait jew enum mhux magħrufa. Din tirċievi l-isem tal-klassi u tgħabbi l-fajl xieraq.

<?php
spl_autoload_register(function (string $klasse): void {
    $praefix = 'App\\';
    $basis   = __DIR__ . '/src/';

    if (!str_starts_with($klasse, $praefix)) {
        return; // mhux kompetenti, jmiss l-autoloader li jmiss
    }
    $datei = $basis . str_replace('\\', '/', substr($klasse, strlen($praefix))) . '.php';
    if (is_file($datei)) {
        require $datei;
    }
});

spl_autoload_register() jista' jissejjaħ diversi drabi. PHP mbagħad jistaqsi lill-autoloaders irreġistrati wieħed wara l-ieħor sakemm wieħed minnhom iġib il-klassi. Fil-prattika applikazzjonijiet kbar spiss ikollhom diversi minnhom: l-autoloader ta' Composer għal-libreriji, wieħed proprju taċ-CMS u oħrajn minn plugins jew moduli. Għall-amministraturi dan ifisser: liema kodiċi verament jittella' ma' talba jirriżulta mill-interazzjoni ta' dawn l-autoloaders kollha u mhux mill-istruttura tal-folders waħedha.

Il-manwal jiskoraġġixxi bil-qawwa t-tfigħ ta' exceptions f'autoloader; PSR-4 jipprojbih espliċitament. Il-funzjoni eqdem __autoload() ġiet immarkata bħala skaduta b'PHP 7.2.0 u tneħħiet b'PHP 8.0.0.

PSR-4: mill-isem tal-klassi sal-mogħdija tal-fajl

PSR-4 huwa standard tal-PHP-FIG. Isem sħiħ ta' klassi jibda b'namespace tal-manifattur. Prefiss tan-namespace jiġi assenjat lil direttorju bażi, il-bqija tal-isem jagħti subfolders, u l-fajl jispiċċa b'.php. L-użu ta' ittri kbar u żgħar irid jaqbel eżatt. Hekk tidher l-assenjazzjoni fil-composer.json:

{
    "autoload": {
        "psr-4": { "App\\": "src/" }
    }
}
Isem tal-klassi Fajl
App\Kunde\Kunde src/Kunde/Kunde.php
App\Rechnung\PdfErzeuger src/Rechnung/PdfErzeuger.php
App\Rechnung\Pdf\Vorlage src/Rechnung/Pdf/Vorlage.php

Ostaklu klassiku huwa l-użu ta' ittri kbar u żgħar. Fuq kompjuters tal-iżvilupp b'Windows jew macOS, is-sistema tal-fajls spiss ma tiddistingwix bejn Kunde.php u kunde.php, fuq server Linux iva. Applikazzjoni li taħdem lokalment mbagħad ma ssibx klassi fuq is-server. Ir-regola ta' PSR-4 li l-ismijiet jintużaw eżatt bl-ortografija korretta tevita sorpriżi bħal dawn waqt il-konsenja.

Minbarra psr-4, Composer jaf classmap għal kodiċi mingħajr struttura standard u files għal fajls li jitgħabbew ma' kull talba, pereżempju funzjonijiet ta' għajnuna. Standards oħra tal-PHP-FIG tiddeskrivihom il-paġna Standards PSR.

Ottimizzazzjoni tal-autoloader fil-produzzjoni

Fil-produzzjoni l-aħjar li l-autoloader ma jfittixx aktar fis-sistema tal-fajls, imma jikkonsulta lista lesta. Composer joffri żewġ livelli għal dan:

  1. composer install --no-dev --optimize-autoloader jittrasforma r-regoli PSR-4 f'lista tal-klassijiet. Dan huwa rakkomandat għall-produzzjoni skont id-dokumentazzjoni ta' Composer.
  2. --classmap-authoritative imur aktar 'il quddiem: il-klassijiet jitgħabbew esklussivament mil-lista. Fajls li mhumiex elenkati l-autoloader mbagħad ma jgħabbihomx xejn.
  3. Ma' kull konsenja l-lista tiġi ġġenerata mill-ġdid, biex klassijiet ġodda jinstabu.

Autoloading u sigurtà wara PHP2Shell

PHP2Shell jaffettwa l-interpretatur ta' PHP, mhux l-autoloader. Jibqgħu obbligatorji l-aġġornament għal PHP 8.5.12, 8.4.27, 8.3.36 jew 8.2.35 u r-restart tal-workers kollha. Wara inċident possibbli, madankollu, l-autoloader jistħoqqlu attenzjoni speċjali: vendor/autoload.php u l-fajls kollha rreġistrati taħt files jiġu eżegwiti ma' kull talba. Linja injettata hemmhekk għalhekk taffettwa l-websajt kollha, mingħajr ma jkun hemm fajl ġdid li jidher fil-folder tal-uploads.

Iċċekkjaw għalhekk jekk vendor u l-fajls tal-autoload jaqblux mal-istat ivverifikat mill-kontroll tal-verżjonijiet. Utli huma l-artikoli Sib il-fajls li nbidlu dan l-aħħar u Qabbel il-fajls tal-qalba taċ-CMS mal-oriġinal. Fil-każ ta' dubju, vendor maħluq mill-ġdid mill-fajl lock huwa aktar sigur minn kull tiswija individwali.

Kif jgħin PHP SOS konkretament?

  • Inqabblu vendor, l-autoloader u l-fajls ta' dħul mal-istat ivverifikat u nimmarkaw kull diverġenza.
  • Nerġgħu nibnu l-istokk tal-pakketti mill-fajl lock u nwaqqfu autoloader ottimizzat.
  • Niċċekkjaw jekk fil-webroot jinsab biss il-folder pubbliku u jekk il-kodiċi sors mhuwiex aċċessibbli direttament b'URL.
  • F'każ ta' infezzjoni nieħdu f'idejna t-tindif bħala parti mit-tneħħija tal-malware u niddokumentaw ir-riżultat.

Mistoqsijiet frekwenti

Minn meta teżisti namespaces f'PHP?

Minn PHP 5.3.0. Skont il-manwal isolvu żewġ problemi: kolliżjonijiet tal-ismijiet bejn kodiċi proprju, PHP u libreriji ta' terzi, kif ukoll ismijiet twal żżejjed tal-klassijiet li nħolqu biss biex jiġu evitati tali kolliżjonijiet.

X'inhi d-differenza bejn PSR-0 u PSR-4?

It-tnejn jimmappjaw ismijiet ta' klassijiet fuq mogħdijiet ta' fajls. Fil-każ ta' PSR-4 il-prefiss tan-namespace ma jiġix ripetut fil-mogħdija tal-fajl, u dan jagħti direttorji irqaq. PSR-0 huwa kklassifikat mill-PHP-FIG bħala skadut, PSR-4 huwa l-istandard rakkomandat.

__autoload() għadu jaħdem?

Le. __autoload() ġie mmarkat bħala skadut b'PHP 7.2.0 u tneħħa b'PHP 8.0.0. Illum l-autoloaders jiġu rreġistrati b'spl_autoload_register(), fil-prattika l-aktar permezz tal-autoloader iġġenerat minn Composer.

Għandi nerġa' niġġenera l-autoloader wara li noħloq klassi ġdida?

B'regoli PSR-4 purament, le; skont id-dokumentazzjoni ta' Composer dan huwa preċiżament vantaġġ ta' PSR-4. Min juża fil-produzzjoni lista ottimizzata tal-klassijiet, irid jerġa' jiġġenerha ma' kull konsenja.

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