Kort sagt: PHP-tillägg (extensions) är moduler i C som utökar PHP med funktioner, till exempel databasdrivrutiner (PDO), kryptering (Sodium, OpenSSL) eller bytekodcachen OPcache. PHP-manualen skiljer mellan Core-, Bundled-, External- och PECL-tillägg. De laddas via extension eller zend_extension i php.ini. Varje tillägg körs i PHP-processen med dess rättigheter. Därför gäller: ladda bara det som behövs och uppdatera tillsammans med PHP.
Vad är PHP Extensions?
PHP:s kärna, Zend Engine, kan köra kod, men mycket av det som applikationer behöver finns i tillägg. De är skrivna i C och kompileras antingen fast in i PHP eller laddas vid start som delat bibliotek (.so under Linux, .dll under Windows).
Viktigt för beslutsfattare: Tillägg är inga plugin i applikationen utan en del av PHP-körmiljön. De installeras av webbhotellet eller serveradministratören, inte av byrån i CMS:et. Saknas ett tillägg rapporterar applikationen oftast ett fel vid installation eller uppdatering.
Lika viktig är avgränsningen mot Composer-paket. Composer installerar bibliotek som är skrivna i PHP och ligger i projektmappen, till exempel ett e-post- eller PDF-paket. Tillägg är däremot kompilerad kod som laddas när PHP startar och gäller för alla applikationer på servern. Många Composer-paket förutsätter vissa tillägg och noterar det i sin composer.json med poster som ext-intl eller ext-sodium. Den som vill kontrollera att ett projekt har alla nödvändiga tillägg kan köra composer check-platform-reqs i projektmappen.
Vilka typer av tillägg finns?
PHP-manualen delar in tilläggen i fyra grupper:
| Grupp | Betydelse enligt manualen | Exempel ur manualen |
|---|---|---|
| Core | del av PHP:s kärna, kan inte stängas av | Arrays, Date/Time, Hash, JSON, PCRE, SPL, Strings |
| Bundled | levereras med PHP | BC Math, Ctype, Fileinfo, Filter, GD, intl, mbstring, PDO, Sessions |
| External | levereras med PHP, kräver externa bibliotek | cURL, DOM, GMP, LDAP, OpenSSL, Sodium, Zip |
| PECL | tillgängliga via PECL, delvis med externa bibliotek | APCu, Memcached, MongoDB, Yaml |
Tillhörigheten kan ändras. Med PHP 8.4 togs enligt releasesidan tilläggen IMAP, OCI8, PDO_OCI och pspell bort ur leveransen och flyttades till PECL. Den som använder dem behöver efter uppgraderingen en separat installation, som också måste underhållas.
Hur laddas tillägg?
Delade tillägg laddas enligt manualen via direktivet extension i php.ini; Zend-tillägg, som ingriper djupare i motorn, via zend_extension. Båda får bara stå i php.ini. Katalogen fastställs av extension_dir, för vilken manualen rekommenderar en absolut sökväg.
; vanliga tillägg
extension=pdo_mysql
extension=sodium
extension=intl
; Zend-tillägg: OPcache (ladda före Xdebug om båda är aktiva)
zend_extension=opcache
Distributioner som Debian och Ubuntu lägger för varje tillägg en egen liten .ini-fil i skanningskatalogen, till exempel under /etc/php/8.3/mods-available/, och aktiverar dem per SAPI med phpenmod och phpdismod. Hur PHP läser in de här filerna förklaras i php.ini förklarad.
Tillägg installeras oftast via pakethanteringen, till exempel som paketet php8.3-intl. PECL-tillägg kan byggas med pecl eller phpize. Enligt manualen är PECL utfasat; i stället rekommenderas PHP Installer for Extensions (PIE). Den som bygger PHP helt själv hittar tips under Kompilera PHP från källkod.
Kontrollera tillägg: vilka är verkligen laddade?
Följande kommandon är rent läsande. Observera att kommandoraden kan ladda andra tillägg än webbplatsen.
php -m # CLI:s moduler
php-fpm8.3 -m # PHP-FPM 8.3:s moduler (namn beroende på distribution)
php --re sodium | head -n 5 # funktioner i ett tillägg
php --ri opcache # konfiguration för ett tillägg
php -r 'var_dump(extension_loaded("intl"));'
I koden kontrollerar applikationer med extension_loaded() om ett tillägg finns och med get_loaded_extensions() vilka som är laddade:
<?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';
Tillägg och säkerhet: färre är bättre
Tillägg körs i samma process som PHP och med samma rättigheter. Ett fel i ett tillägg kan därför väga lika tungt som ett fel i kärnan. Därav följer fyra regler:
- Ladda bara det som behövs. Varje extra tillägg ökar angreppsytan. Kontrollera er lista mot applikationens systemkrav.
- Uppdatera tillsammans med PHP. Medföljande tillägg kommer med PHP-uppdateringen. PECL- och tredjepartstillägg behöver egna uppdateringar och måste passa till den nya PHP-versionen.
- Inga utvecklingsverktyg i produktion. Felsökare och profilerare som Xdebug hör bara hemma i utvecklingsmiljöer.
- Spärra funktioner riktat. Där tillägg medför funktioner för systemkommandon hjälper Använda disable_functions rätt.
Vid PHP2Shell ligger sårbarheterna i PHP:s kärna, inte i ett tillägg. Att stänga av moduler täpper inte till dem; det som behövs är uppdateringen till 8.5.12, 8.4.27, 8.3.36 eller 8.2.35 med omstart av alla PHP-processer. Efter uppdateringen bör ni kontrollera att alla tillägg laddas igen, eftersom saknade moduler ofta märks först vid vissa funktioner. Hur ni håller beroenden under kontroll långsiktigt beskrivs i Hålla beroenden aktuella.
Hur hjälper PHP SOS konkret?
- Kartlägga beståndet: Vi listar per SAPI alla laddade tillägg med ursprung och version.
- Rensa ut: Vi jämför listan med er applikations behov och avaktiverar överflödigt efter test.
- Uppdatera: Inom ramen för serverhärdning för vi PHP och alla tredjepartstillägg till ett underhållet läge.
- Kontrollera efter uppdateringar: Vi kontrollerar att alla nödvändiga moduler är laddade igen efter varje PHP-uppdatering.
Vanliga frågor
Vad är skillnaden mellan extension och zend_extension?
Med extension laddar PHP vanliga tillägg som databasdrivrutiner. Med zend_extension laddas enligt manualen Zend-tillägg som ingriper djupare i motorn, till exempel OPcache eller Xdebug. Båda direktiven får bara stå i php.ini.
Hur ser jag vilka tillägg som är laddade?
På kommandoraden med php -m, för webbplatsen via funktionen get_loaded_extensions() i en kortvarig kontrollfil eller via php-fpm -m för respektive version. Observera att CLI och webb-SAPI kan ladda olika tillägg.
Vad är PECL och vad är PIE?
PECL är en katalog över PHP-tillägg som tillhandahålls via paketsystemet PEAR. Enligt PHP-manualen är PECL utfasat; i stället rekommenderas PHP Installer for Extensions (PIE).
Täpper avstängning av ett tillägg till PHP2Shell?
Nej. PHP2Shell-sårbarheterna ligger i PHP:s kärna, inte i ett tillägg som kan stängas av. Färre tillägg minskar angreppsytan i allmänhet men ersätter inte uppdateringen till en rättad version.