Lyhyesti: PHP-laajennukset (extensions) ovat C-kielellä kirjoitettuja moduuleja, jotka lisäävät PHP:hen toimintoja, esimerkiksi tietokanta-ajurit (PDO), salauksen (Sodium, OpenSSL) tai tavukoodivälimuisti OPcachen. PHP-käsikirja erottaa Core-, Bundled-, External- ja PECL-laajennukset. Ne ladataan php.ini-tiedoston extension- tai zend_extension-direktiivillä. Jokainen laajennus toimii PHP-prosessissa sen oikeuksilla. Siksi pätee: lataa vain tarvittava ja päivitä PHP:n mukana.
Mitä PHP-laajennukset ovat?
PHP:n ydin, Zend Engine, osaa suorittaa koodia, mutta suuri osa siitä, mitä sovellukset tarvitsevat, on laajennuksissa. Ne on kirjoitettu C-kielellä ja joko käännetty kiinteästi PHP:hen tai ladataan käynnistyksessä jaettuna kirjastona (.so Linuxissa, .dll Windowsissa).
Päättäjälle tärkeää: laajennukset eivät ole sovelluksen lisäosia vaan osa PHP-ajoympäristöä. Hosting-yritys tai palvelimen ylläpitäjä asentaa ne, ei verkkotoimisto CMS:ssä. Jos laajennus puuttuu, sovellus ilmoittaa yleensä virheestä asennuksessa tai päivityksessä.
Yhtä tärkeä on ero Composer-paketteihin. Composer asentaa kirjastoja, jotka on kirjoitettu PHP:llä ja jotka sijaitsevat projektikansiossa, esimerkiksi sähköposti- tai PDF-paketin. Laajennukset sen sijaan ovat käännettyä koodia, joka ladataan PHP:n käynnistyessä ja joka koskee kaikkia palvelimen sovelluksia. Monet Composer-paketit edellyttävät tiettyjä laajennuksia ja merkitsevät sen composer.json-tiedostoonsa merkinnöillä kuten ext-intl tai ext-sodium. Joka haluaa tarkistaa, löytääkö projekti kaikki tarvittavat laajennukset, voi ajaa projektikansiossa komennon composer check-platform-reqs.
Minkälaisia laajennuksia on?
PHP-käsikirja jakaa laajennukset neljään ryhmään:
| Ryhmä | Merkitys käsikirjan mukaan | Esimerkkejä käsikirjasta |
|---|---|---|
| Core | osa PHP:n ydintä, ei sammutettavissa | Arrays, Date/Time, Hash, JSON, PCRE, SPL, Strings |
| Bundled | toimitetaan PHP:n mukana | BC Math, Ctype, Fileinfo, Filter, GD, intl, mbstring, PDO, Sessions |
| External | toimitetaan PHP:n mukana, tarvitsevat ulkoisia kirjastoja | cURL, DOM, GMP, LDAP, OpenSSL, Sodium, Zip |
| PECL | saatavilla PECL:n kautta, osin ulkoisten kirjastojen kanssa | APCu, Memcached, MongoDB, Yaml |
Luokittelu voi muuttua. PHP 8.4:n myötä julkaisusivun mukaan laajennukset IMAP, OCI8, PDO_OCI ja pspell poistettiin toimituksesta ja siirrettiin PECL:iin. Joka niitä käyttää, tarvitsee päivityksen jälkeen erillisen asennuksen, jota on myös huollettava.
Miten laajennukset ladataan?
Jaetut laajennukset ladataan käsikirjan mukaan php.ini-tiedoston extension-direktiivillä; Zend-laajennukset, jotka puuttuvat moottoriin syvemmin, zend_extension-direktiivillä. Molemmat saavat olla vain php.ini-tiedostossa. Hakemiston määrittää extension_dir, jolle käsikirja suosittelee absoluuttista polkua.
; tavalliset laajennukset
extension=pdo_mysql
extension=sodium
extension=intl
; Zend-laajennus: OPcache (lataa ennen Xdebugia, jos molemmat ovat aktiivisia)
zend_extension=opcache
Jakelut, kuten Debian ja Ubuntu, tallentavat jokaiselle laajennukselle oman pienen .ini-tiedostonsa hakuhakemistoon, esimerkiksi polkuun /etc/php/8.3/mods-available/, ja aktivoivat ne SAPI:kohtaisesti komennoilla phpenmod ja phpdismod. Miten PHP lukee nämä tiedostot, selitetään sivulla php.ini selitettynä.
Laajennukset asennetaan yleensä paketinhallinnan kautta, esimerkiksi pakettina php8.3-intl. PECL-laajennukset voi rakentaa komennoilla pecl tai phpize. Käsikirjan mukaan PECL on poistumassa käytöstä; suositus on PHP Installer for Extensions (PIE). Joka rakentaa PHP:n kokonaan itse, löytää vinkkejä sivulta PHP:n kääntäminen lähdekoodista.
Laajennusten tarkistus: mitkä on todella ladattu?
Seuraavat komennot ovat puhtaasti lukevia. Huomatkaa, että komentorivi voi ladata eri laajennukset kuin verkkosivusto.
php -m # CLI:n moduulit
php-fpm8.3 -m # PHP-FPM 8.3:n moduulit (nimi jakelusta riippuen)
php --re sodium | head -n 5 # laajennuksen funktiot
php --ri opcache # laajennuksen konfiguraatio
php -r 'var_dump(extension_loaded("intl"));'
Koodissa sovellukset tarkistavat extension_loaded()-funktiolla, onko laajennus olemassa, ja get_loaded_extensions()-funktiolla, mitkä on ladattu:
<?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';
Laajennukset ja tietoturva: vähemmän on enemmän
Laajennukset toimivat samassa prosessissa kuin PHP ja samoilla oikeuksilla. Laajennuksen virhe voi siksi olla yhtä vakava kuin ytimen virhe. Siitä seuraa neljä sääntöä:
- Lataa vain tarvittava. Jokainen lisälaajennus kasvattaa hyökkäyspinta-alaa. Tarkistakaa luettelonne sovelluksen järjestelmävaatimuksia vasten.
- Päivitä PHP:n mukana. Mukana toimitetut laajennukset tulevat PHP-päivityksen mukana. PECL- ja kolmannen osapuolen laajennukset tarvitsevat omat päivityksensä ja niiden on sovittava uuteen PHP-versioon.
- Kehitystyökalut eivät kuulu tuotantoon. Debuggerit ja profiloijat, kuten Xdebug, kuuluvat vain kehitysympäristöihin.
- Estä funktiot kohdennetusti. Missä laajennukset tuovat mukanaan funktioita järjestelmäkomentoja varten, auttaa disable_functions oikein käytettynä.
PHP2Shellissä haavoittuvuudet ovat PHP:n ytimessä, eivät laajennuksessa. Moduulien sammuttaminen ei sulje niitä; tarvitaan päivitys versioon 8.5.12, 8.4.27, 8.3.36 tai 8.2.35 ja kaikkien PHP-prosessien uudelleenkäynnistys. Päivityksen jälkeen kannattaa tarkistaa, latautuvatko kaikki laajennukset taas, sillä puuttuvat moduulit huomataan usein vasta tietyissä toiminnoissa. Miten riippuvuudet pidetään pysyvästi hallinnassa, kuvaa Riippuvuuksien pitäminen ajan tasalla.
Miten PHP SOS auttaa konkreettisesti?
- Kartoitus: Luettelemme SAPI:kohtaisesti kaikki ladatut laajennukset alkuperineen ja versioineen.
- Karsinta: Vertaamme luetteloa sovelluksenne tarpeeseen ja poistamme tarpeettoman käytöstä testin jälkeen.
- Päivitys: Palvelimen koventamisen puitteissa saatamme PHP:n ja kaikki kolmannen osapuolen laajennukset huollettuun tilaan.
- Tarkistus päivitysten jälkeen: Varmistamme, että jokaisen PHP-päivityksen jälkeen kaikki tarvittavat moduulit on ladattu uudelleen.
Usein kysytyt kysymykset
Mikä ero on extension- ja zend_extension-direktiivillä?
Direktiivillä extension PHP lataa tavalliset laajennukset, kuten tietokanta-ajurit. Direktiivillä zend_extension ladataan käsikirjan mukaan Zend-laajennukset, jotka puuttuvat moottoriin syvemmin, esimerkiksi OPcache tai Xdebug. Molemmat direktiivit saavat olla vain php.ini-tiedostossa.
Miten näen, mitkä laajennukset on ladattu?
Komentorivillä komennolla php -m, verkkosivustolle funktiolla get_loaded_extensions() tilapäisessä tarkistustiedostossa tai komennolla php-fpm -m kyseisessä versiossa. Huomatkaa, että CLI ja verkko-SAPI voivat ladata eri laajennuksia.
Mikä on PECL ja mikä PIE?
PECL on hakemisto PHP-laajennuksille, jotka toimitetaan PEAR-pakettijärjestelmän kautta. PHP-käsikirjan mukaan PECL on poistumassa käytöstä; sen sijaan suositellaan PHP Installer for Extensions -työkalua (PIE).
Sulkeeko laajennuksen poistaminen käytöstä PHP2Shellin?
Ei. PHP2Shell-haavoittuvuudet ovat PHP:n ytimessä, eivät laajennuksessa, jonka voi sammuttaa. Vähemmän laajennuksia pienentää hyökkäyspinta-alaa yleisesti, mutta ei korvaa päivitystä korjattuun versioon.