Kort gezegd: PHP-extensies (extensions) zijn modules in C die PHP uitbreiden met functies, bijvoorbeeld databasestuurprogramma's (PDO), versleuteling (Sodium, OpenSSL) of de bytecodecache OPcache. De PHP-handleiding onderscheidt core-, bundled-, external- en PECL-extensies. Ze worden geladen via extension of zend_extension in de php.ini. Elke extensie draait in het PHP-proces met de rechten daarvan. Daarom geldt: alleen laden wat nodig is en samen met PHP bijwerken.
Wat zijn PHP-extensies?
De kern van PHP, de Zend Engine, kan code uitvoeren, maar veel van wat toepassingen nodig hebben zit in extensies. Ze zijn in C geschreven en worden ofwel vast in PHP ingecompileerd, ofwel als gedeelde bibliotheek (.so onder Linux, .dll onder Windows) bij het starten geladen.
Belangrijk voor beslissers: extensies zijn geen plug-ins van de toepassing, maar onderdeel van de PHP-runtime. Ze worden door de hoster of serverbeheerder geïnstalleerd, niet door het bureau in het CMS. Ontbreekt een extensie, dan meldt de toepassing meestal een fout bij de installatie of bij de update.
Even belangrijk is de afbakening ten opzichte van Composer-pakketten. Composer installeert bibliotheken die in PHP zijn geschreven en in de projectmap staan, bijvoorbeeld een mail- of pdf-pakket. Extensies daarentegen zijn gecompileerde code die bij het starten van PHP wordt geladen en voor alle toepassingen op de server geldt. Veel Composer-pakketten veronderstellen bepaalde extensies en vermelden dat in hun composer.json met vermeldingen als ext-intl of ext-sodium. Wie wil controleren of een project alle benodigde extensies aantreft, kan in de projectmap composer check-platform-reqs uitvoeren.
Welke soorten extensies zijn er?
De PHP-handleiding deelt extensies in vier groepen in:
| Groep | Betekenis volgens de handleiding | Voorbeelden uit de handleiding |
|---|---|---|
| Core | deel van de PHP-kern, niet uit te schakelen | Arrays, Date/Time, Hash, JSON, PCRE, SPL, Strings |
| Bundled | met PHP meegeleverd | BC Math, Ctype, Fileinfo, Filter, GD, intl, mbstring, PDO, Sessions |
| External | met PHP meegeleverd, hebben externe bibliotheken nodig | cURL, DOM, GMP, LDAP, OpenSSL, Sodium, Zip |
| PECL | verkrijgbaar via PECL, deels met externe bibliotheken | APCu, Memcached, MongoDB, Yaml |
De indeling kan veranderen. Met PHP 8.4 zijn volgens de releasepagina de extensies IMAP, OCI8, PDO_OCI en pspell uit de standaardlevering verwijderd en naar PECL verplaatst. Wie ze gebruikt, heeft na de upgrade een aparte installatie nodig, die eveneens onderhouden moet worden.
Hoe worden extensies geladen?
Gedeelde extensies worden volgens de handleiding via de directive extension in de php.ini geladen; Zend-extensies die dieper in de engine ingrijpen via zend_extension. Beide mogen alleen in de php.ini staan. De map bepaalt extension_dir, waarvoor de handleiding een absoluut pad adviseert.
; gewone extensies
extension=pdo_mysql
extension=sodium
extension=intl
; Zend-extensie: OPcache (vóór Xdebug laden, indien beide actief)
zend_extension=opcache
Distributies als Debian en Ubuntu plaatsen voor elke extensie een eigen klein .ini-bestand in de scanmap, bijvoorbeeld onder /etc/php/8.3/mods-available/, en activeren het per SAPI met phpenmod en phpdismod. Hoe PHP deze bestanden inleest, legt De php.ini uitgelegd uit.
Geïnstalleerd worden extensies meestal via het pakketbeheer, bijvoorbeeld als pakket php8.3-intl. PECL-extensies zijn met pecl of phpize te bouwen. Volgens de handleiding is PECL afgekeurd; aanbevolen wordt de PHP Installer for Extensions (PIE). Wie PHP volledig zelf bouwt, vindt aanwijzingen onder PHP uit de broncode compileren.
Extensies controleren: welke zijn echt geladen?
De volgende opdrachten zijn uitsluitend lezend. Houd er rekening mee dat de opdrachtregel andere extensies kan laden dan de website.
php -m # modules van de CLI
php-fpm8.3 -m # modules van PHP-FPM 8.3 (naam per distributie)
php --re sodium | head -n 5 # functies van een extensie
php --ri opcache # configuratie van een extensie
php -r 'var_dump(extension_loaded("intl"));'
In de code controleren toepassingen met extension_loaded() of een extensie aanwezig is en met get_loaded_extensions() welke zijn geladen:
<?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';
Extensies en beveiliging: minder is meer
Extensies draaien in hetzelfde proces als PHP en met dezelfde rechten. Een fout in een extensie kan daarom even zwaar wegen als een fout in de kern. Daaruit volgen vier regels:
- Alleen laden wat nodig is. Elke extra extensie vergroot het aanvalsoppervlak. Controleer uw lijst aan de hand van de systeemvereisten van de toepassing.
- Samen met PHP bijwerken. Meegeleverde extensies komen met de PHP-update. PECL- en externe extensies hebben eigen updates nodig en moeten bij de nieuwe PHP-versie passen.
- Ontwikkelhulpmiddelen niet in productie. Debuggers en profilers als Xdebug horen alleen in ontwikkelomgevingen.
- Functies gericht blokkeren. Waar extensies functies voor systeemopdrachten meebrengen, helpt disable_functions juist inzetten.
Bij PHP2Shell zitten de lekken in de kern van PHP, niet in een extensie. Het uitschakelen van modules sluit ze niet; nodig is de update naar 8.5.12, 8.4.27, 8.3.36 of 8.2.35 met een herstart van alle PHP-processen. Na de update moet u controleren of alle extensies weer worden geladen, want ontbrekende modules vallen vaak pas bij bepaalde functies op. Hoe u afhankelijkheden duurzaam onder controle houdt, beschrijft Afhankelijkheden actueel houden.
Hoe helpt PHP SOS concreet?
- Bestand in kaart brengen: Wij sommen per SAPI alle geladen extensies op met herkomst en versie.
- Uitmesten: Wij vergelijken de lijst met de behoefte van uw toepassing en schakelen overbodige zaken na een test uit.
- Bijwerken: In het kader van de serverhardening brengen wij PHP en alle externe extensies op een onderhouden stand.
- Na updates controleren: Wij controleren dat na elke PHP-update alle benodigde modules weer zijn geladen.
Veelgestelde vragen
Wat is het verschil tussen extension en zend_extension?
Met extension laadt PHP gewone extensies zoals databasestuurprogramma's. Met zend_extension worden volgens de handleiding Zend-extensies geladen die dieper in de engine ingrijpen, bijvoorbeeld OPcache of Xdebug. Beide directives mogen alleen in de php.ini staan.
Hoe zie ik welke extensies zijn geladen?
Op de opdrachtregel met php -m, voor de website via de functie get_loaded_extensions() in een kortstondig testbestand of via php-fpm -m van de betreffende versie. Houd er rekening mee dat CLI en web-SAPI verschillende extensies kunnen laden.
Wat is PECL en wat is PIE?
PECL is een register van PHP-extensies die via het PEAR-pakketsysteem worden aangeboden. Volgens de PHP-handleiding is PECL afgekeurd; aanbevolen wordt in plaats daarvan de PHP Installer for Extensions (PIE).
Sluit het uitschakelen van een extensie PHP2Shell?
Nee. De PHP2Shell-lekken zitten in de kern van PHP, niet in een uit te schakelen extensie. Minder extensies verkleinen het aanvalsoppervlak in het algemeen, maar vervangen de update naar een verholpen versie niet.