Stručně: Rozšíření PHP (extensions) jsou moduly v jazyce C, které PHP doplňují o funkce, například ovladače databází (PDO), šifrování (Sodium, OpenSSL) nebo bytecode cache OPcache. Příručka PHP rozlišuje rozšíření Core, Bundled, External a PECL. Načítají se přes extension nebo zend_extension v php.ini. Každé rozšíření běží v procesu PHP s jeho oprávněními. Proto platí: načítat jen to, co je potřeba, a aktualizovat společně s PHP.
Co jsou rozšíření PHP?
Jádro PHP, Zend Engine, umí provádět kód, ale mnoho z toho, co aplikace potřebují, sídlí v rozšířeních. Jsou napsána v jazyce C a buď se pevně zkompilují do PHP, nebo se jako sdílená knihovna (.so v Linuxu, .dll ve Windows) načtou při spuštění.
Důležité pro rozhodovatele: rozšíření nejsou pluginy aplikace, ale součást běhového prostředí PHP. Instaluje je poskytovatel hostingu nebo správce serveru, nikoli agentura v CMS. Pokud rozšíření chybí, aplikace většinou hlásí chybu při instalaci nebo aktualizaci.
Stejně důležité je odlišení od balíčků Composer. Composer instaluje knihovny, které jsou napsány v PHP a leží v adresáři projektu, například balíček pro e-mail nebo PDF. Rozšíření jsou naproti tomu zkompilovaný kód, který se načítá při spuštění PHP a platí pro všechny aplikace na serveru. Mnoho balíčků Composer předpokládá určitá rozšíření a uvádí to v composer.json záznamy jako ext-intl nebo ext-sodium. Kdo chce ověřit, zda projekt najde všechna potřebná rozšíření, může v adresáři projektu spustit composer check-platform-reqs.
Jaké druhy rozšíření existují?
Příručka PHP řadí rozšíření do čtyř skupin:
| Skupina | Význam podle příručky | Příklady z příručky |
|---|---|---|
| Core | součást jádra PHP, nelze vypnout | Arrays, Date/Time, Hash, JSON, PCRE, SPL, Strings |
| Bundled | dodávané s PHP | BC Math, Ctype, Fileinfo, Filter, GD, intl, mbstring, PDO, Sessions |
| External | dodávané s PHP, vyžadují externí knihovny | cURL, DOM, GMP, LDAP, OpenSSL, Sodium, Zip |
| PECL | dostupné přes PECL, zčásti s externími knihovnami | APCu, Memcached, MongoDB, Yaml |
Zařazení se může měnit. S PHP 8.4 byla podle stránky vydání rozšíření IMAP, OCI8, PDO_OCI a pspell odstraněna z dodávky a přesunuta do PECL. Kdo je používá, potřebuje po upgradu samostatnou instalaci, kterou je rovněž nutné udržovat.
Jak se rozšíření načítají?
Sdílená rozšíření se podle příručky načítají direktivou extension v php.ini; rozšíření Zend, která zasahují hlouběji do enginu, přes zend_extension. Obě smějí být pouze v php.ini. Adresář určuje extension_dir, pro který příručka doporučuje absolutní cestu.
; běžná rozšíření
extension=pdo_mysql
extension=sodium
extension=intl
; rozšíření Zend: OPcache (načíst před Xdebug, jsou-li aktivní obě)
zend_extension=opcache
Distribuce jako Debian a Ubuntu zakládají pro každé rozšíření vlastní malý soubor .ini ve skenovaném adresáři, například pod /etc/php/8.3/mods-available/, a aktivují jej pro každé SAPI pomocí phpenmod a phpdismod. Jak PHP tyto soubory načítá, vysvětluje článek php.ini vysvětlen.
Rozšíření se instalují většinou přes správu balíčků, například jako balíček php8.3-intl. Rozšíření PECL lze sestavit pomocí pecl nebo phpize. Podle příručky je PECL zastaralé; doporučuje se PHP Installer for Extensions (PIE). Kdo si PHP celé sestavuje sám, najde pokyny v článku Kompilace PHP ze zdrojového kódu.
Kontrola rozšíření: která jsou skutečně načtena?
Následující příkazy jsou čistě pro čtení. Pamatujte, že příkazová řádka může načítat jiná rozšíření než web.
php -m # moduly CLI
php-fpm8.3 -m # moduly PHP-FPM 8.3 (název podle distribuce)
php --re sodium | head -n 5 # funkce rozšíření
php --ri opcache # konfigurace rozšíření
php -r 'var_dump(extension_loaded("intl"));'
V kódu aplikace ověřují pomocí extension_loaded(), zda rozšíření existuje, a pomocí get_loaded_extensions(), která jsou načtena:
<?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';
Rozšíření a bezpečnost: méně je více
Rozšíření běží ve stejném procesu jako PHP a se stejnými oprávněními. Chyba v rozšíření proto může vážit stejně jako chyba v jádru. Plynou z toho čtyři pravidla:
- Načítat jen to, co je potřeba. Každé další rozšíření zvětšuje útočnou plochu. Zkontrolujte svůj seznam podle systémových požadavků aplikace.
- Aktualizovat společně s PHP. Dodávaná rozšíření přicházejí s aktualizací PHP. Rozšíření PECL a od třetích stran potřebují vlastní aktualizace a musí odpovídat nové verzi PHP.
- Vývojové nástroje ne do produkce. Debuggery a profilery jako Xdebug patří jen do vývojových prostředí.
- Funkce cíleně uzamknout. Tam, kde rozšíření přinášejí funkce pro systémové příkazy, pomůže správné použití disable_functions.
U PHP2Shell leží zranitelnosti v jádru PHP, nikoli v rozšíření. Vypnutí modulů je neuzavře; nutná je aktualizace na 8.5.12, 8.4.27, 8.3.36 nebo 8.2.35 s restartem všech procesů PHP. Po aktualizaci byste měli zkontrolovat, zda se všechna rozšíření znovu načítají, protože chybějící moduly se často projeví až u určitých funkcí. Jak mít závislosti trvale pod kontrolou, popisuje článek Udržování závislostí aktuálních.
Jak konkrétně pomáhá PHP SOS?
- Zmapovat stav: Vypíšeme pro každé SAPI všechna načtená rozšíření s původem a verzí.
- Vyčistit: Porovnáme seznam s potřebami vaší aplikace a po testu deaktivujeme nadbytečné.
- Aktualizovat: V rámci zpevnění serveru převedeme PHP a všechna cizí rozšíření na udržovaný stav.
- Zkontrolovat po aktualizacích: Ověříme, že jsou po každé aktualizaci PHP znovu načteny všechny potřebné moduly.
Časté dotazy
Jaký je rozdíl mezi extension a zend_extension?
Pomocí extension načítá PHP běžná rozšíření, jako jsou ovladače databází. Pomocí zend_extension se podle příručky načítají rozšíření Zend, která zasahují hlouběji do enginu, například OPcache nebo Xdebug. Obě direktivy smějí být pouze v php.ini.
Jak zjistím, která rozšíření jsou načtena?
V příkazové řádce pomocí php -m, pro web přes funkci get_loaded_extensions() v krátce nahraném kontrolním souboru nebo přes php-fpm -m příslušné verze. Pamatujte, že CLI a webové SAPI mohou načítat různá rozšíření.
Co je PECL a co je PIE?
PECL je adresář rozšíření PHP poskytovaných přes balíčkový systém PEAR. Podle příručky PHP je PECL zastaralé; doporučuje se místo něj PHP Installer for Extensions (PIE).
Uzavře vypnutí rozšíření PHP2Shell?
Ne. Zranitelnosti PHP2Shell leží v jádru PHP, nikoli ve vypnutelném rozšíření. Méně rozšíření zmenšuje útočnou plochu obecně, ale nenahrazuje aktualizaci na opravenou verzi.