Ukratko: PHP ekstenzije (extensions) moduli su u jeziku C koji PHP dopunjuju funkcijama, na primjer upravljačkim programima baza podataka (PDO), šifriranjem (Sodium, OpenSSL) ili predmemorijom bytecodea OPcache. PHP priručnik razlikuje Core, Bundled, External i PECL ekstenzije. Učitavaju se putem extension ili zend_extension u php.ini. Svaka ekstenzija radi u PHP procesu s njegovim pravima. Zato vrijedi: učitavati samo ono što je potrebno i ažurirati zajedno s PHP-om.
Što su PHP ekstenzije?
Jezgra PHP-a, Zend Engine, može izvršavati kod, ali mnogo toga što aplikacije trebaju nalazi se u ekstenzijama. Napisane su u jeziku C i ili se čvrsto ukompiliraju u PHP ili se pri pokretanju učitavaju kao zajednički korištena biblioteka (.so pod Linuxom, .dll pod Windowsom).
Za donositelje odluka važno je: ekstenzije nisu dodaci aplikacije, nego dio PHP izvršnog okruženja. Instalira ih pružatelj hostinga ili administrator poslužitelja, a ne agencija u CMS-u. Ako ekstenzija nedostaje, aplikacija najčešće javlja pogrešku pri instalaciji ili ažuriranju.
Jednako je važna razlika u odnosu na Composer pakete. Composer instalira biblioteke napisane u PHP-u koje leže u mapi projekta, na primjer paket za e-poštu ili PDF. Ekstenzije su, naprotiv, kompiliran kod koji se učitava pri pokretanju PHP-a i vrijedi za sve aplikacije na poslužitelju. Mnogi Composer paketi pretpostavljaju određene ekstenzije i to bilježe u svojoj composer.json unosima poput ext-intl ili ext-sodium. Tko želi provjeriti nalazi li projekt sve potrebne ekstenzije, može u mapi projekta izvršiti composer check-platform-reqs.
Koje vrste ekstenzija postoje?
PHP priručnik ekstenzije razvrstava u četiri skupine:
| Skupina | Značenje prema priručniku | Primjeri iz priručnika |
|---|---|---|
| Core | dio PHP jezgre, ne može se isključiti | Arrays, Date/Time, Hash, JSON, PCRE, SPL, Strings |
| Bundled | isporučuje se s PHP-om | BC Math, Ctype, Fileinfo, Filter, GD, intl, mbstring, PDO, Sessions |
| External | isporučuje se s PHP-om, trebaju vanjske biblioteke | cURL, DOM, GMP, LDAP, OpenSSL, Sodium, Zip |
| PECL | dostupno putem PECL-a, djelomično s vanjskim bibliotekama | APCu, Memcached, MongoDB, Yaml |
Razvrstavanje se može promijeniti. S PHP-om 8.4 prema stranici izdanja ekstenzije IMAP, OCI8, PDO_OCI i pspell uklonjene su iz isporuke i premještene u PECL. Tko ih koristi, nakon nadogradnje treba zasebnu instalaciju koju također treba održavati.
Kako se ekstenzije učitavaju?
Zajednički korištene ekstenzije prema priručniku učitavaju se direktivom extension u php.ini; Zend ekstenzije, koje dublje zadiru u engine, putem zend_extension. Obje smiju stajati samo u php.ini. Direktorij određuje extension_dir, za što priručnik preporučuje apsolutnu putanju.
; obične ekstenzije
extension=pdo_mysql
extension=sodium
extension=intl
; Zend ekstenzija: OPcache (učitati prije Xdebuga ako su obje aktivne)
zend_extension=opcache
Distribucije poput Debiana i Ubuntua za svaku ekstenziju pohranjuju malu vlastitu .ini datoteku u direktoriju za skeniranje, na primjer pod /etc/php/8.3/mods-available/, i aktiviraju je po SAPI-ju pomoću phpenmod i phpdismod. Kako PHP te datoteke učitava, objašnjava članak php.ini objašnjen.
Ekstenzije se najčešće instaliraju putem upravljanja paketima, na primjer kao paket php8.3-intl. PECL ekstenzije mogu se izgraditi pomoću pecl ili phpize. Prema priručniku PECL je ukinut; preporučuje se PHP Installer for Extensions (PIE). Tko PHP potpuno gradi sam, napomene će naći u članku Kompiliranje PHP-a iz izvornog koda.
Provjeriti ekstenzije: koje su stvarno učitane?
Sljedeće naredbe samo čitaju. Imajte na umu da naredbeni redak može učitavati druge ekstenzije od web-stranice.
php -m # moduli CLI-ja
php-fpm8.3 -m # moduli PHP-FPM-a 8.3 (naziv ovisi o distribuciji)
php --re sodium | head -n 5 # funkcije ekstenzije
php --ri opcache # konfiguracija ekstenzije
php -r 'var_dump(extension_loaded("intl"));'
U kodu aplikacije provjeravaju postoji li ekstenzija pomoću extension_loaded(), a koje su učitane pomoću get_loaded_extensions():
<?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';
Ekstenzije i sigurnost: manje je više
Ekstenzije rade u istom procesu kao PHP i s istim pravima. Pogreška u ekstenziji stoga može biti jednako teška kao pogreška u jezgri. Iz toga proizlaze četiri pravila:
- Učitavati samo ono što je potrebno. Svaka dodatna ekstenzija povećava površinu napada. Svoj popis provjerite prema sistemskim zahtjevima aplikacije.
- Ažurirati zajedno s PHP-om. Isporučene ekstenzije stižu s PHP ažuriranjem. PECL i tuđe ekstenzije trebaju vlastita ažuriranja i moraju odgovarati novoj PHP verziji.
- Razvojni alati ne u produkciju. Debuggeri i profileri poput Xdebuga pripadaju samo u razvojna okruženja.
- Ciljano zaključati funkcije. Gdje ekstenzije donose funkcije za sistemske naredbe, pomaže članak Pravilna uporaba disable_functions.
Kod PHP2Shella ranjivosti leže u jezgri PHP-a, a ne u ekstenziji. Isključivanje modula ne zatvara ih; potrebno je ažuriranje na 8.5.12, 8.4.27, 8.3.36 ili 8.2.35 uz ponovno pokretanje svih PHP procesa. Nakon ažuriranja trebali biste provjeriti učitavaju li se sve ekstenzije ponovno, jer nedostajući moduli često postanu primjetni tek kod određenih funkcija. Kako ovisnosti trajno držati pod kontrolom, opisuje članak Održavati ovisnosti ažurnima.
Kako PHP SOS konkretno pomaže?
- Evidentirati stanje: Po SAPI-ju popisujemo sve učitane ekstenzije s podrijetlom i verzijom.
- Razrijediti: Popis uspoređujemo s potrebama Vaše aplikacije i nepotrebno deaktiviramo nakon testa.
- Ažurirati: U okviru ojačavanja poslužitelja PHP i sve tuđe ekstenzije dovodimo na održavano stanje.
- Provjeriti nakon ažuriranja: Kontroliramo da su nakon svakog PHP ažuriranja ponovno učitani svi potrebni moduli.
Česta pitanja
Koja je razlika između extension i zend_extension?
Pomoću extension PHP učitava obične ekstenzije poput upravljačkih programa baza podataka. Pomoću zend_extension prema priručniku se učitavaju Zend ekstenzije koje dublje zadiru u engine, na primjer OPcache ili Xdebug. Obje direktive smiju stajati samo u php.ini.
Kako vidjeti koje su ekstenzije učitane?
U naredbenom retku pomoću php -m, za web-stranicu putem funkcije get_loaded_extensions() u kratkotrajnoj probnoj datoteci ili putem php-fpm -m dotične verzije. Imajte na umu da CLI i web SAPI mogu učitavati različite ekstenzije.
Što su PECL i PIE?
PECL je direktorij PHP ekstenzija koje se isporučuju putem paketnog sustava PEAR. Prema PHP priručniku PECL je ukinut; umjesto njega preporučuje se PHP Installer for Extensions (PIE).
Zatvara li isključivanje ekstenzije PHP2Shell?
Ne. PHP2Shell ranjivosti leže u jezgri PHP-a, a ne u ekstenziji koja se može isključiti. Manje ekstenzija općenito smanjuje površinu napada, ali ne zamjenjuje ažuriranje na ispravljenu verziju.