Röviden: A PHP-bővítmények (extensions) C nyelvű modulok, amelyek funkciókkal egészítik ki a PHP-t, például adatbázis-illesztőkkel (PDO), titkosítással (Sodium, OpenSSL) vagy az OPcache bájtkód-gyorsítótárral. A PHP-kézikönyv core, bundled, external és PECL bővítményeket különböztet meg. A php.ini-ben az extension vagy a zend_extension tölti be őket. Minden bővítmény a PHP-folyamatban fut, annak jogaival. Ezért érvényes: csak azt töltse be, amire szükség van, és a PHP-val együtt frissítse.
Mik a PHP-bővítmények?
A PHP magja, a Zend Engine, képes kódot végrehajtani, de sok minden, amire az alkalmazásoknak szükségük van, a bővítményekben van. C nyelven íródtak, és vagy fixen beleforgatják őket a PHP-ba, vagy közösen használt programkönyvtárként (.so Linuxon, .dll Windowson) töltődnek be induláskor.
Döntéshozóknak fontos: a bővítmények nem az alkalmazás bővítményei (pluginjai), hanem a PHP-futtatókörnyezet részei. A tárhelyszolgáltató vagy a szerveradminisztrátor telepíti őket, nem az ügynökség a CMS-ben. Ha hiányzik egy bővítmény, az alkalmazás többnyire hibát jelez telepítéskor vagy frissítéskor.
Ugyanilyen fontos az elhatárolás a Composer-csomagoktól. A Composer PHP-ban írt, a projektmappában található programkönyvtárakat telepít, például egy levelező- vagy PDF-csomagot. A bővítmények ezzel szemben lefordított kódok, amelyek a PHP indításakor töltődnek be, és a szerver összes alkalmazására érvényesek. Sok Composer-csomag meghatározott bővítményeket tételez fel, és ezt a composer.json fájlban olyan bejegyzésekkel jelzi, mint az ext-intl vagy az ext-sodium. Aki ellenőrizni akarja, hogy egy projekt megtalálja-e az összes szükséges bővítményt, a projektmappában futtathatja a composer check-platform-reqs parancsot.
Milyen fajta bővítmények léteznek?
A PHP-kézikönyv a bővítményeket négy csoportba sorolja:
| Csoport | Jelentése a kézikönyv szerint | Példák a kézikönyvből |
|---|---|---|
| Core | a PHP magjának része, nem kapcsolható ki | Arrays, Date/Time, Hash, JSON, PCRE, SPL, Strings |
| Bundled | a PHP-val együtt szállított | BC Math, Ctype, Fileinfo, Filter, GD, intl, mbstring, PDO, Sessions |
| External | a PHP-val együtt szállított, külső programkönyvtárakat igényel | cURL, DOM, GMP, LDAP, OpenSSL, Sodium, Zip |
| PECL | a PECL-en keresztül elérhető, részben külső programkönyvtárakkal | APCu, Memcached, MongoDB, Yaml |
A besorolás változhat. A PHP 8.4-gyel a kiadási oldal szerint az IMAP, OCI8, PDO_OCI és pspell bővítményeket kivették a szállított csomagból, és a PECL-be helyezték át. Aki használja őket, a frissítés után külön telepítést igényel, amelyet szintén gondozni kell.
Hogyan töltődnek be a bővítmények?
A közösen használt bővítményeket a kézikönyv szerint a php.ini-ben az extension direktíva tölti be; a mélyebben a motorba avatkozó Zend-bővítményeket a zend_extension. Mindkettő csak a php.ini-ben szerepelhet. A könyvtárat az extension_dir határozza meg, amelyhez a kézikönyv abszolút útvonalat ajánl.
; normál bővítmények
extension=pdo_mysql
extension=sodium
extension=intl
; Zend-bővítmény: OPcache (az Xdebug előtt töltse be, ha mindkettő aktív)
zend_extension=opcache
Az olyan disztribúciók, mint a Debian és az Ubuntu, minden bővítményhez külön kis .ini fájlt helyeznek el a szkennelt könyvtárban, például a /etc/php/8.3/mods-available/ alatt, és SAPI-nként a phpenmod és phpdismod parancsokkal aktiválják őket. Hogyan olvassa be a PHP ezeket a fájlokat, azt A php.ini elmagyarázva oldal magyarázza.
A bővítményeket többnyire a csomagkezelőn keresztül telepítik, például a php8.3-intl csomagként. A PECL-bővítmények a pecl vagy a phpize segítségével építhetők. A kézikönyv szerint a PECL elavult; a PHP Installer for Extensions (PIE) ajánlott. Aki a PHP-t teljesen maga építi, útmutatást talál a PHP fordítása forráskódból oldalon.
A bővítmények ellenőrzése: melyek vannak valójában betöltve?
A következő parancsok kizárólag olvasnak. Vegye figyelembe, hogy a parancssor más bővítményeket tölthet be, mint a weboldal.
php -m # a CLI moduljai
php-fpm8.3 -m # a PHP-FPM 8.3 moduljai (a név disztribúciónként eltérő)
php --re sodium | head -n 5 # egy bővítmény függvényei
php --ri opcache # egy bővítmény konfigurációja
php -r 'var_dump(extension_loaded("intl"));'
A kódban az alkalmazások az extension_loaded() függvénnyel ellenőrzik, hogy megvan-e egy bővítmény, és a get_loaded_extensions() függvénnyel, hogy melyek vannak betöltve:
<?php
$benoetigt = ['pdo_mysql', 'mbstring', 'intl', 'sodium'];
$fehlend = array_diff($benoetigt, array_map('strtolower', get_loaded_extensions()));
echo $fehlend ? 'Fehlt: ' . implode(', ', $fehlend) : 'Alle Erweiterungen vorhanden';
Bővítmények és biztonság: kevesebb több
A bővítmények ugyanabban a folyamatban és ugyanazokkal a jogokkal futnak, mint a PHP. Egy bővítményben lévő hiba ezért olyan súlyos lehet, mint a magban lévő. Ebből négy szabály adódik:
- Csak azt töltse be, amire szükség van. Minden további bővítmény növeli a támadási felületet. Ellenőrizze a listáját az alkalmazás rendszerkövetelményeivel szemben.
- A PHP-val együtt frissítse. A szállított bővítmények a PHP-frissítéssel érkeznek. A PECL- és idegen bővítmények saját frissítést igényelnek, és illeszkedniük kell az új PHP-verzióhoz.
- Fejlesztői eszközök ne kerüljenek éles üzembe. A hibakeresők és profilozók, például az Xdebug, csak fejlesztői környezetbe valók.
- A függvényeket célzottan zárolja. Ahol a bővítmények rendszerparancsokhoz való függvényeket hoznak magukkal, segít a disable_functions helyes használata.
A PHP2Shell esetében a rések a PHP magjában vannak, nem egy bővítményben. A modulok kikapcsolása nem zárja be őket; a 8.5.12, 8.4.27, 8.3.36 vagy 8.2.35 verzióra való frissítés kell az összes PHP-folyamat újraindításával. A frissítés után ellenőrizze, hogy az összes bővítmény ismét betöltődik-e, mert a hiányzó modulok gyakran csak bizonyos funkcióknál tűnnek fel. Hogyan tarthatja tartósan kézben a függőségeket, azt a Függőségek naprakészen tartása cikk írja le.
Hogyan segít konkrétan a PHP SOS?
- Állomány felmérése: SAPI-nként felsoroljuk az összes betöltött bővítményt eredettel és verzióval.
- Kiszűrés: Összevetjük a listát az alkalmazása igényeivel, és teszt után kikapcsoljuk a feleslegest.
- Frissítés: A szerver-megerősítés keretében a PHP-t és az összes idegen bővítményt gondozott állapotra hozzuk.
- Ellenőrzés frissítések után: Minden PHP-frissítés után ellenőrizzük, hogy az összes szükséges modul ismét be van töltve.
Gyakori kérdések
Mi a különbség az extension és a zend_extension között?
Az extension-nel a PHP normál bővítményeket tölt be, például adatbázis-illesztőket. A zend_extension-nel a kézikönyv szerint olyan Zend-bővítmények töltődnek be, amelyek mélyebben avatkoznak a motorba, például az OPcache vagy az Xdebug. Mindkét direktíva csak a php.ini-ben szerepelhet.
Hogyan látom, mely bővítmények vannak betöltve?
A parancssorban a php -m paranccsal, a weboldalhoz a get_loaded_extensions() függvénnyel egy rövid időre elhelyezett ellenőrző fájlban, vagy az adott verzió php-fpm -m parancsával. Vegye figyelembe, hogy a CLI és a webes SAPI különböző bővítményeket tölthet be.
Mi a PECL, és mi a PIE?
A PECL a PEAR csomagrendszeren keresztül biztosított PHP-bővítmények jegyzéke. A PHP-kézikönyv szerint a PECL elavult; helyette a PHP Installer for Extensions (PIE) ajánlott.
Lezárja a PHP2Shellt egy bővítmény kikapcsolása?
Nem. A PHP2Shell-rések a PHP magjában vannak, nem egy kikapcsolható bővítményben. Kevesebb bővítmény általánosságban csökkenti a támadási felületet, de nem helyettesíti a javított verzióra való frissítést.