Kurz gesagt: PHP-Erweiterungen (Extensions) sind Module in C, die PHP um Funktionen ergänzen, etwa Datenbanktreiber (PDO), Verschlüsselung (Sodium, OpenSSL) oder den Bytecode-Cache OPcache. Das PHP-Handbuch unterscheidet Core-, Bundled-, External- und PECL-Erweiterungen. Geladen werden sie über extension oder zend_extension in der php.ini. Jede Erweiterung läuft im PHP-Prozess mit dessen Rechten. Deshalb gilt: nur laden, was gebraucht wird, und mit PHP zusammen aktualisieren.
Was sind PHP Extensions?
Der Kern von PHP, die Zend Engine, kann Code ausführen, aber vieles, was Anwendungen brauchen, steckt in Erweiterungen. Sie sind in C geschrieben und werden entweder fest in PHP einkompiliert oder als gemeinsam genutzte Bibliothek (.so unter Linux, .dll unter Windows) beim Start geladen.
Für Entscheider wichtig: Erweiterungen sind keine Plugins der Anwendung, sondern Teil der PHP-Laufzeit. Sie werden vom Hoster oder Server-Admin installiert, nicht von der Agentur im CMS. Fehlt eine Erweiterung, meldet die Anwendung meist einen Fehler bei der Installation oder beim Update.
Ebenso wichtig ist die Abgrenzung zu Composer-Paketen. Composer installiert Bibliotheken, die in PHP geschrieben sind und im Projektordner liegen, etwa ein Mail- oder PDF-Paket. Erweiterungen dagegen sind kompilierter Code, der beim Start von PHP geladen wird und für alle Anwendungen auf dem Server gilt. Viele Composer-Pakete setzen bestimmte Erweiterungen voraus und vermerken das in ihrer composer.json mit Einträgen wie ext-intl oder ext-sodium. Wer prüfen will, ob ein Projekt alle nötigen Erweiterungen vorfindet, kann im Projektordner composer check-platform-reqs ausführen.
Welche Arten von Erweiterungen gibt es?
Das PHP-Handbuch ordnet Erweiterungen vier Gruppen zu:
| Gruppe | Bedeutung laut Handbuch | Beispiele aus dem Handbuch |
|---|---|---|
| Core | Teil des PHP-Kerns, nicht abschaltbar | Arrays, Date/Time, Hash, JSON, PCRE, SPL, Strings |
| Bundled | mit PHP ausgeliefert | BC Math, Ctype, Fileinfo, Filter, GD, intl, mbstring, PDO, Sessions |
| External | mit PHP ausgeliefert, brauchen externe Bibliotheken | cURL, DOM, GMP, LDAP, OpenSSL, Sodium, Zip |
| PECL | über PECL erhältlich, teils mit externen Bibliotheken | APCu, Memcached, MongoDB, Yaml |
Die Zuordnung kann sich ändern. Mit PHP 8.4 wurden laut Release-Seite die Erweiterungen IMAP, OCI8, PDO_OCI und pspell aus dem Lieferumfang entfernt und nach PECL verschoben. Wer sie nutzt, braucht nach dem Upgrade eine separate Installation, die ebenfalls gepflegt werden muss.
Wie werden Erweiterungen geladen?
Gemeinsam genutzte Erweiterungen werden laut Handbuch über die Direktive extension in der php.ini geladen; Zend-Erweiterungen, die tiefer in die Engine eingreifen, über zend_extension. Beide dürfen nur in der php.ini stehen. Das Verzeichnis legt extension_dir fest, wofür das Handbuch einen absoluten Pfad empfiehlt.
; normale Erweiterungen
extension=pdo_mysql
extension=sodium
extension=intl
; Zend-Erweiterung: OPcache (vor Xdebug laden, falls beide aktiv)
zend_extension=opcache
Distributionen wie Debian und Ubuntu legen für jede Erweiterung eine eigene kleine .ini-Datei im Scan-Verzeichnis ab, etwa unter /etc/php/8.3/mods-available/, und aktivieren sie je SAPI mit phpenmod und phpdismod. Wie PHP diese Dateien einliest, erklärt Die php.ini erklärt.
Installiert werden Erweiterungen meist über die Paketverwaltung, etwa als Paket php8.3-intl. PECL-Erweiterungen lassen sich mit pecl oder phpize bauen. Laut Handbuch ist PECL abgekündigt; empfohlen wird der PHP Installer for Extensions (PIE). Wer PHP komplett selbst baut, findet Hinweise unter PHP aus dem Quellcode kompilieren.
Erweiterungen prüfen: welche sind wirklich geladen?
Die folgenden Befehle sind rein lesend. Beachten Sie, dass die Kommandozeile andere Erweiterungen laden kann als die Website.
php -m # Module der CLI
php-fpm8.3 -m # Module von PHP-FPM 8.3 (Name je Distribution)
php --re sodium | head -n 5 # Funktionen einer Erweiterung
php --ri opcache # Konfiguration einer Erweiterung
php -r 'var_dump(extension_loaded("intl"));'
Im Code prüfen Anwendungen mit extension_loaded(), ob eine Erweiterung vorhanden ist, und mit get_loaded_extensions(), welche geladen sind:
<?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';
Erweiterungen und Sicherheit: weniger ist mehr
Erweiterungen laufen im selben Prozess wie PHP und mit denselben Rechten. Ein Fehler in einer Erweiterung kann deshalb so schwer wiegen wie ein Fehler im Kern. Daraus ergeben sich vier Regeln:
- Nur laden, was gebraucht wird. Jede zusätzliche Erweiterung vergrößert die Angriffsfläche. Prüfen Sie Ihre Liste gegen die Systemanforderungen der Anwendung.
- Mit PHP zusammen aktualisieren. Mitgelieferte Erweiterungen kommen mit dem PHP-Update. PECL- und Fremd-Erweiterungen brauchen eigene Updates und müssen zur neuen PHP-Version passen.
- Entwicklungswerkzeuge nicht in Produktion. Debugger und Profiler wie Xdebug gehören nur in Entwicklungsumgebungen.
- Funktionen gezielt sperren. Wo Erweiterungen Funktionen für Systembefehle mitbringen, hilft disable_functions richtig einsetzen.
Bei PHP2Shell liegen die Lücken im Kern von PHP, nicht in einer Erweiterung. Das Abschalten von Modulen schließt sie nicht; nötig ist das Update auf 8.5.12, 8.4.27, 8.3.36 oder 8.2.35 mit Neustart aller PHP-Prozesse. Nach dem Update sollten Sie prüfen, ob alle Erweiterungen wieder geladen werden, denn fehlende Module fallen oft erst bei bestimmten Funktionen auf. Wie Sie Abhängigkeiten dauerhaft im Griff behalten, beschreibt Abhängigkeiten aktuell halten.
Wie hilft PHP SOS konkret?
- Bestand erfassen: Wir listen je SAPI alle geladenen Erweiterungen mit Herkunft und Version auf.
- Ausmisten: Wir gleichen die Liste mit dem Bedarf Ihrer Anwendung ab und deaktivieren Überflüssiges nach Test.
- Aktualisieren: Im Rahmen der Server-Härtung bringen wir PHP und alle Fremd-Erweiterungen auf einen gepflegten Stand.
- Nach Updates prüfen: Wir kontrollieren, dass nach jedem PHP-Update alle benötigten Module wieder geladen sind.
Häufige Fragen
Was ist der Unterschied zwischen extension und zend_extension?
Mit extension lädt PHP normale Erweiterungen wie Datenbanktreiber. Mit zend_extension werden laut Handbuch Zend-Erweiterungen geladen, die tiefer in die Engine eingreifen, zum Beispiel OPcache oder Xdebug. Beide Direktiven dürfen nur in der php.ini stehen.
Wie sehe ich, welche Erweiterungen geladen sind?
Auf der Kommandozeile mit php -m, für die Website über die Funktion get_loaded_extensions() in einer kurzzeitigen Prüfdatei oder über php-fpm -m der jeweiligen Version. Beachten Sie, dass CLI und Web-SAPI unterschiedliche Erweiterungen laden können.
Was ist PECL und was ist PIE?
PECL ist ein Verzeichnis von PHP-Erweiterungen, die über das PEAR-Paketsystem bereitgestellt werden. Laut PHP-Handbuch ist PECL abgekündigt; empfohlen wird stattdessen der PHP Installer for Extensions (PIE).
Schließt das Abschalten einer Erweiterung PHP2Shell?
Nein. Die PHP2Shell-Lücken liegen im Kern von PHP, nicht in einer abschaltbaren Erweiterung. Weniger Erweiterungen verkleinern die Angriffsfläche allgemein, ersetzen aber nicht das Update auf eine korrigierte Version.