Pe scurt: Extensiile PHP (extensions) sunt module scrise în C, care completează PHP cu funcții, de exemplu drivere de baze de date (PDO), criptare (Sodium, OpenSSL) sau cache-ul de bytecode OPcache. Manualul PHP distinge extensii Core, Bundled, External și PECL. Ele sunt încărcate prin extension sau zend_extension în php.ini. Fiecare extensie rulează în procesul PHP, cu drepturile acestuia. De aceea se aplică: încărcați doar ce este necesar și actualizați împreună cu PHP.
Ce sunt extensiile PHP?
Nucleul PHP, Zend Engine, poate executa cod, dar multe dintre lucrurile de care au nevoie aplicațiile se află în extensii. Ele sunt scrise în C și sunt fie compilate fix în PHP, fie încărcate la pornire ca bibliotecă partajată (.so sub Linux, .dll sub Windows).
Important pentru factorii de decizie: extensiile nu sunt pluginuri ale aplicației, ci parte din mediul de execuție PHP. Ele sunt instalate de furnizorul de hosting sau de administratorul serverului, nu de agenție în CMS. Dacă lipsește o extensie, aplicația raportează de obicei o eroare la instalare sau la actualizare.
La fel de important este deosebirea față de pachetele Composer. Composer instalează biblioteci scrise în PHP și aflate în directorul proiectului, de exemplu un pachet de e-mail sau PDF. Extensiile, în schimb, sunt cod compilat, încărcat la pornirea PHP și valabil pentru toate aplicațiile de pe server. Multe pachete Composer presupun anumite extensii și le consemnează în composer.json cu intrări precum ext-intl sau ext-sodium. Cine vrea să verifice dacă un proiect găsește toate extensiile necesare poate rula în directorul proiectului composer check-platform-reqs.
Ce tipuri de extensii există?
Manualul PHP încadrează extensiile în patru grupe:
| Grupă | Semnificație potrivit manualului | Exemple din manual |
|---|---|---|
| Core | parte a nucleului PHP, nu pot fi dezactivate | Arrays, Date/Time, Hash, JSON, PCRE, SPL, Strings |
| Bundled | livrate cu PHP | BC Math, Ctype, Fileinfo, Filter, GD, intl, mbstring, PDO, Sessions |
| External | livrate cu PHP, necesită biblioteci externe | cURL, DOM, GMP, LDAP, OpenSSL, Sodium, Zip |
| PECL | disponibile prin PECL, parțial cu biblioteci externe | APCu, Memcached, MongoDB, Yaml |
Încadrarea se poate schimba. Cu PHP 8.4, potrivit paginii de lansare, extensiile IMAP, OCI8, PDO_OCI și pspell au fost scoase din pachetul livrat și mutate în PECL. Cine le folosește are nevoie după upgrade de o instalare separată, care trebuie și ea întreținută.
Cum sunt încărcate extensiile?
Extensiile partajate sunt încărcate, potrivit manualului, prin directiva extension din php.ini; extensiile Zend, care intervin mai adânc în motor, prin zend_extension. Ambele pot fi doar în php.ini. Directorul îl stabilește extension_dir, pentru care manualul recomandă o cale absolută.
; extensii obișnuite
extension=pdo_mysql
extension=sodium
extension=intl
; extensie Zend: OPcache (se încarcă înaintea Xdebug, dacă ambele sunt active)
zend_extension=opcache
Distribuții precum Debian și Ubuntu depun pentru fiecare extensie un mic fișier .ini propriu în directorul de scanare, de exemplu sub /etc/php/8.3/mods-available/, și o activează pentru fiecare SAPI cu phpenmod și phpdismod. Cum citește PHP aceste fișiere explică php.ini explicat.
Extensiile se instalează de obicei prin gestionarul de pachete, de exemplu ca pachet php8.3-intl. Extensiile PECL pot fi construite cu pecl sau phpize. Potrivit manualului, PECL este depreciat; se recomandă PHP Installer for Extensions (PIE). Cine își compilează PHP complet singur găsește indicații la Compilarea PHP din codul sursă.
Verificarea extensiilor: care sunt cu adevărat încărcate?
Comenzile următoare sunt strict de citire. Rețineți că linia de comandă poate încărca alte extensii decât site-ul.
php -m # modulele CLI
php-fpm8.3 -m # modulele PHP-FPM 8.3 (numele diferă în funcție de distribuție)
php --re sodium | head -n 5 # funcțiile unei extensii
php --ri opcache # configurația unei extensii
php -r 'var_dump(extension_loaded("intl"));'
În cod, aplicațiile verifică cu extension_loaded() dacă o extensie există și cu get_loaded_extensions() care sunt încărcate:
<?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';
Extensii și securitate: mai puțin înseamnă mai mult
Extensiile rulează în același proces ca PHP și cu aceleași drepturi. O eroare dintr-o extensie poate fi de aceea la fel de gravă ca una din nucleu. Rezultă patru reguli:
- Încărcați doar ce este necesar. Fiecare extensie suplimentară mărește suprafața de atac. Verificați lista dumneavoastră față de cerințele de sistem ale aplicației.
- Actualizați împreună cu PHP. Extensiile livrate vin cu actualizarea PHP. Extensiile PECL și cele ale terților au nevoie de actualizări proprii și trebuie să se potrivească cu noua versiune PHP.
- Fără instrumente de dezvoltare în producție. Depanatoarele și profilerele precum Xdebug aparțin doar mediilor de dezvoltare.
- Blocați funcțiile țintit. Acolo unde extensiile aduc funcții pentru comenzi de sistem, ajută Utilizarea corectă a disable_functions.
La PHP2Shell, vulnerabilitățile se află în nucleul PHP, nu într-o extensie. Dezactivarea modulelor nu le închide; este necesară actualizarea la 8.5.12, 8.4.27, 8.3.36 sau 8.2.35, cu repornirea tuturor proceselor PHP. După actualizare ar trebui să verificați dacă toate extensiile sunt din nou încărcate, deoarece modulele lipsă se observă adesea abia la anumite funcții. Cum țineți dependențele sub control pe termen lung descrie Menținerea la zi a dependențelor.
Cum ajută PHP SOS concret?
- Inventarierea: Listăm pentru fiecare SAPI toate extensiile încărcate, cu proveniență și versiune.
- Curățarea: Corelăm lista cu necesarul aplicației dumneavoastră și dezactivăm ce este de prisos, după testare.
- Actualizarea: În cadrul întăririi serverului aducem PHP și toate extensiile terților la o stare întreținută.
- Verificarea după actualizări: Controlăm că după fiecare actualizare PHP toate modulele necesare sunt din nou încărcate.
Întrebări frecvente
Care este diferența dintre extension și zend_extension?
Cu extension, PHP încarcă extensii obișnuite, precum driverele de baze de date. Cu zend_extension se încarcă, potrivit manualului, extensii Zend care intervin mai adânc în motor, de exemplu OPcache sau Xdebug. Ambele directive pot fi doar în php.ini.
Cum văd ce extensii sunt încărcate?
În linia de comandă cu php -m, pentru site prin funcția get_loaded_extensions() într-un fișier de verificare temporar sau prin php-fpm -m al versiunii respective. Rețineți că CLI și SAPI-ul web pot încărca extensii diferite.
Ce este PECL și ce este PIE?
PECL este un director de extensii PHP, furnizate prin sistemul de pachete PEAR. Potrivit manualului PHP, PECL este depreciat; se recomandă în schimb PHP Installer for Extensions (PIE).
Închide dezactivarea unei extensii vulnerabilitatea PHP2Shell?
Nu. Vulnerabilitățile PHP2Shell se află în nucleul PHP, nu într-o extensie care poate fi dezactivată. Mai puține extensii reduc în general suprafața de atac, dar nu înlocuiesc actualizarea la o versiune corectată.