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

Nimeruumid ja automaatlaadimine (PSR-4)

Nimeruumid korrastavad PHP koodi, automaatlaadimine laeb klassid täpselt siis, kui neid vaja on. Siit näete, kuidas PSR-4 seab klassinimed failidele vastavusse ja miks autolaadurit tuleb pärast intsidenti kontrollida.

Seis Lugemisaeg 4 minPHP teadmised

Lühidalt: Nimeruumid on PHP-s midagi klassinimede kaustade taolist: App\Rechnung\Pdf ja Bibliothek\Pdf võivad eksisteerida kõrvuti, üksteist segamata. Automaatlaadimine tagab, et PHP laeb klassi alles siis, kui seda esimest korda vaja läheb. Standard PSR-4 määrab, kuidas klassinimest saab failitee; Composer loob seejärel sobiva autolaaduri. Kuna see autolaadur töötab igal päringul, kuulub see pärast turvaintsidenti esimeste kontrollitavate asjade hulka.

Miks PHP vajab nimeruume

Nimeruume on PHP-s alates versioonist 5.3.0. Enne seda jagasid kõik klassid ja funktsioonid ühte globaalset nimeruumi. Kui kaks teeki kandsid nime Logger, tekkis jama. Arendajad aitasid end pikkade nimedega nagu Firma_Modul_Unterbereich_Logger.

PHP käsiraamat nimetab kaht probleemi, mille nimeruumid lahendavad: nimekonfliktid oma koodi, PHP sisemiste klasside ja kolmandate osapoolte teekide vahel ning liiga pikad nimed, mis tekkisid vaid nende konfliktide vältimiseks. Otsustajale tähendab see: alles nimeruumid tegid praktiliseks kombineerida ühes projektis kümneid võõraid pakette, nagu Composeriga täna tavaks on.

Nimeruumid praktikas: namespace, use, aliased

Fail deklareerib oma nimeruumi esimeses lauses. Käsuga use toob see sisse klasse teistest nimeruumidest, soovi korral lühema nime all.

<?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);
    }
}

Selle klassi täisnimi on App\Rechnung\PdfErzeuger. Juhtiv kaldkriips märgis \sprintf viitab selgesõnaliselt globaalsele PHP funktsioonile.

Automaatlaadimine: klasside laadimine vajaduse korral

Ilma automaatlaadimiseta peaks iga skript kõik vajalikud failid käsuga require ise sisse tooma. Funktsiooniga spl_autoload_register() registreeritakse selle asemel funktsioon, mida PHP kutsub välja, niipea kui kasutatakse tundmatut klassi, liidest, trait'i või enumi. See saab klassinime ja laeb sobiva faili.

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

    if (!str_starts_with($klasse, $praefix)) {
        return; // ei ole pädev, järgmine autolaadur on järjekorras
    }
    $datei = $basis . str_replace('\\', '/', substr($klasse, strlen($praefix))) . '.php';
    if (is_file($datei)) {
        require $datei;
    }
});

spl_autoload_register() saab välja kutsuda mitu korda. PHP küsib siis registreeritud autolaadurite käest üksteise järel, kuni üks klassi laeb. Praktikas on suurtel rakendustel neid sageli mitu: Composeri autolaadur teekide jaoks, CMS-i enda oma ning lisaks pluginatelt või moodulitelt. Adminnile tähendab see: milline kood päringul tegelikult laaditakse, tuleneb kõigi nende autolaadurite koostoimest, mitte ainult kaustastruktuurist.

Käsiraamat soovitab tungivalt autolaaduris erandeid mitte visata; PSR-4 keelab selle selgesõnaliselt. Vanem funktsioon __autoload() märgiti PHP 7.2.0-ga iganenuks ja eemaldati PHP 8.0.0-ga.

PSR-4: klassinimest failiteeni

PSR-4 on PHP-FIG standard. Täielik klassinimi algab tootja nimeruumiga. Nimeruumi eesliide seotakse baaskataloogiga, ülejäänud nimi annab alamkaustad ja fail lõpeb laiendiga .php. Suur- ja väiketähed peavad täpselt kokku langema. Nii näeb vastavus välja failis composer.json:

{
    "autoload": {
        "psr-4": { "App\\": "src/" }
    }
}
Klassinimi Fail
App\Kunde\Kunde src/Kunde/Kunde.php
App\Rechnung\PdfErzeuger src/Rechnung/PdfErzeuger.php
App\Rechnung\Pdf\Vorlage src/Rechnung/Pdf/Vorlage.php

Klassikaline komistuskivi on suur- ja väiketähtede kasutus. Windowsi või macOS-iga arendusarvutitel failisüsteem sageli ei erista faile Kunde.php ja kunde.php, Linuxi serveris aga küll. Rakendus, mis kohapeal töötab, ei leia siis serveris klassi üles. PSR-4 reegel kasutada nimesid täpselt õiges kirjaviisis väldib selliseid üllatusi väljaveeretamisel.

Lisaks psr-4-le tunneb Composer võtit classmap standardstruktuurita koodi jaoks ja files failide jaoks, mis laaditakse igal päringul, näiteks abifunktsioonid. PHP-FIG teisi standardeid kirjeldab leht PSR-standardid.

Autolaaduri optimeerimine tootmises

Tootmises ei otsi autolaadur kõige parem enam failisüsteemist, vaid vaatab valmis nimekirjast. Composer pakub selleks kaht astet:

  1. composer install --no-dev --optimize-autoloader muudab PSR-4 reeglid klassinimekirjaks. See on Composeri dokumentatsiooni järgi tootmiseks soovitatav.
  2. --classmap-authoritative läheb kaugemale: klasse laaditakse ainult nimekirjast. Nimekirjas mitte olevaid faile autolaadur siis üldse ei laadi.
  3. Iga väljaveeretamise korral luuakse nimekiri uuesti, et uusi klasse leitaks.

Automaatlaadimine ja turvalisus pärast PHP2Shelli

PHP2Shell puudutab PHP interpretaatorit, mitte autolaadurit. Kohustuslikuks jääb uuendus versioonile PHP 8.5.12, 8.4.27, 8.3.36 või 8.2.35 ja kõigi workerite taaskäivitus. Võimaliku intsidendi järel väärib autolaadur siiski erilist tähelepanu: vendor/autoload.php ja kõik kirjega files registreeritud failid täidetakse igal päringul. Sinna sisse smugeldatud rida mõjub seega kogu veebisaidile, ilma et üleslaadimiskaustas oleks mõni silmatorkav uus fail.

Kontrollige seetõttu, kas vendor ja autoload-failid vastavad versioonihalduse kontrollitud seisule. Abiks on artiklid Hiljuti muudetud failide leidmine ja CMS-i tuumafailide võrdlemine originaaliga. Kahtluse korral on lukufailist värskelt loodud vendor turvalisem kui iga üksikparandus.

Kuidas PHP SOS konkreetselt aitab?

  • Võrdleme kausta vendor, autolaadurit ja sisendfaile kontrollitud seisuga ning märgime iga kõrvalekalde.
  • Taastame paketivaru lukufailist uuesti ja seadistame optimeeritud autolaaduri.
  • Kontrollime, kas veebijuures on ainult avalik kaust ja lähtekood ei ole URL-i kaudu otse kättesaadav.
  • Nakatumise korral võtame puhastamise enda peale pahavara eemaldamise raames ja dokumenteerime tulemuse.

Korduma kippuvad küsimused

Millest alates on PHP-s nimeruumid?

Alates PHP 5.3.0-st. Käsiraamatu järgi lahendavad need kaks probleemi: nimekonfliktid oma koodi, PHP ja kolmandate osapoolte teekide vahel ning liiga pikad klassinimed, mis tekkisid vaid selliste konfliktide vältimiseks.

Mis vahe on PSR-0 ja PSR-4 vahel?

Mõlemad seavad klassinimed failiteedega vastavusse. PSR-4 puhul ei korrata nimeruumi eesliidet failiteel, mis annab lamedamad kataloogid. PHP-FIG on PSR-0 märkinud iganenuks, PSR-4 on soovitatav standard.

Kas __autoload() töötab veel?

Ei. __autoload() märgiti PHP 7.2.0-ga iganenuks ja eemaldati PHP 8.0.0-ga. Tänapäeval registreeritakse autolaadurid funktsiooniga spl_autoload_register(), praktikas enamasti Composeri loodud autolaaduri kaudu.

Kas pärast uue klassi loomist tuleb autolaaduri uuesti luua?

Puhaste PSR-4 reeglite korral mitte, Composeri dokumentatsiooni järgi on see PSR-4 eelis. Kes kasutab tootmises optimeeritud klassinimekirja, peab selle iga väljaveeretamise korral uuesti looma.

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