Īsi: PHP paplašinājumi (Extensions) ir C valodā rakstīti moduļi, kas PHP papildina ar funkcijām, piemēram, datubāzu draiveriem (PDO), šifrēšanu (Sodium, OpenSSL) vai baitkoda kešatmiņu OPcache. PHP rokasgrāmata nošķir Core, Bundled, External un PECL paplašinājumus. Tos ielādē ar extension vai zend_extension php.ini. Katrs paplašinājums darbojas PHP procesā ar tā tiesībām. Tāpēc ir spēkā: ielādēt tikai nepieciešamo un atjaunināt kopā ar PHP.
Kas ir PHP paplašinājumi?
PHP kodols, Zend Engine, var izpildīt kodu, bet daudz kas, kas lietojumprogrammām vajadzīgs, atrodas paplašinājumos. Tie ir rakstīti C valodā un tiek vai nu stingri iekompilēti PHP, vai startēšanas laikā ielādēti kā koplietojama bibliotēka (.so sistēmā Linux, .dll sistēmā Windows).
Lēmumu pieņēmējiem svarīgi: paplašinājumi nav lietojumprogrammas spraudņi, bet PHP izpildes vides daļa. Tos instalē hostinga sniedzējs vai servera administrators, nevis aģentūra CMS. Ja paplašinājuma trūkst, lietojumprogramma parasti ziņo par kļūdu instalēšanas vai atjaunināšanas laikā.
Tikpat svarīga ir nošķiršana no Composer pakotnēm. Composer instalē bibliotēkas, kas rakstītas PHP un atrodas projekta mapē, piemēram, pasta vai PDF pakotni. Paplašinājumi turpretī ir kompilēts kods, ko ielādē PHP startēšanas laikā un kas ir spēkā visām servera lietojumprogrammām. Daudzas Composer pakotnes pieprasa noteiktus paplašinājumus un to norāda savā composer.json ar ierakstiem, piemēram, ext-intl vai ext-sodium. Kas vēlas pārbaudīt, vai projekts atrod visus nepieciešamos paplašinājumus, projekta mapē var izpildīt composer check-platform-reqs.
Kādi paplašinājumu veidi pastāv?
PHP rokasgrāmata paplašinājumus iedala četrās grupās:
| Grupa | Nozīme saskaņā ar rokasgrāmatu | Piemēri no rokasgrāmatas |
|---|---|---|
| Core | PHP kodola daļa, nav izslēdzams | Arrays, Date/Time, Hash, JSON, PCRE, SPL, Strings |
| Bundled | piegādāts kopā ar PHP | BC Math, Ctype, Fileinfo, Filter, GD, intl, mbstring, PDO, Sessions |
| External | piegādāts kopā ar PHP, vajadzīgas ārējas bibliotēkas | cURL, DOM, GMP, LDAP, OpenSSL, Sodium, Zip |
| PECL | pieejams caur PECL, daļēji ar ārējām bibliotēkām | APCu, Memcached, MongoDB, Yaml |
Piederība var mainīties. Ar PHP 8.4 saskaņā ar izlaiduma lapu paplašinājumi IMAP, OCI8, PDO_OCI un pspell tika izņemti no piegādes komplekta un pārvietoti uz PECL. Kas tos izmanto, tam pēc jauninājuma vajadzīga atsevišķa instalācija, kas arī jāuztur.
Kā paplašinājumi tiek ielādēti?
Koplietojamie paplašinājumi saskaņā ar rokasgrāmatu tiek ielādēti ar direktīvu extension php.ini; Zend paplašinājumi, kas dziļāk iejaucas dzinējā, ar zend_extension. Abas drīkst atrasties tikai php.ini. Direktoriju nosaka extension_dir, kam rokasgrāmata iesaka absolūtu ceļu.
; parastie paplašinājumi
extension=pdo_mysql
extension=sodium
extension=intl
; Zend paplašinājums: OPcache (ielādēt pirms Xdebug, ja abi aktīvi)
zend_extension=opcache
Distributīvi, piemēram, Debian un Ubuntu, katram paplašinājumam skenēšanas direktorijā izveido savu nelielu .ini failu, piemēram, zem /etc/php/8.3/mods-available/, un aktivizē to katrai SAPI ar phpenmod un phpdismod. Kā PHP šos failus nolasa, izskaidro php.ini izskaidrots.
Paplašinājumus parasti instalē ar pakotņu pārvaldību, piemēram, kā pakotni php8.3-intl. PECL paplašinājumus var būvēt ar pecl vai phpize. Saskaņā ar rokasgrāmatu PECL ir izsludināts par novecojušu; tiek ieteikts PHP Installer for Extensions (PIE). Kas PHP būvē pilnībā pats, norādes atradīs sadaļā PHP kompilēšana no pirmkoda.
Paplašinājumu pārbaude: kuri patiešām ir ielādēti?
Turpmākās komandas ir tikai lasošas. Ņemiet vērā, ka komandrinda var ielādēt citus paplašinājumus nekā vietne.
php -m # CLI moduļi
php-fpm8.3 -m # PHP-FPM 8.3 moduļi (nosaukums atkarībā no distributīva)
php --re sodium | head -n 5 # paplašinājuma funkcijas
php --ri opcache # paplašinājuma konfigurācija
php -r 'var_dump(extension_loaded("intl"));'
Kodā lietojumprogrammas ar extension_loaded() pārbauda, vai paplašinājums ir, un ar get_loaded_extensions(), kuri ir ielādēti:
<?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';
Paplašinājumi un drošība: mazāk ir vairāk
Paplašinājumi darbojas tajā pašā procesā kā PHP un ar tām pašām tiesībām. Kļūda paplašinājumā tāpēc var būt tikpat smaga kā kļūda kodolā. No tā izriet četri noteikumi:
- Ielādēt tikai nepieciešamo. Katrs papildu paplašinājums palielina uzbrukuma virsmu. Pārbaudiet savu sarakstu pret lietojumprogrammas sistēmas prasībām.
- Atjaunināt kopā ar PHP. Komplektā iekļautie paplašinājumi nāk ar PHP atjauninājumu. PECL un ārējiem paplašinājumiem vajadzīgi savi atjauninājumi, un tiem jāatbilst jaunajai PHP versijai.
- Izstrādes rīki nav ražošanā. Atkļūdotāji un profilētāji, piemēram, Xdebug, pieder tikai izstrādes vidēm.
- Funkcijas bloķēt mērķtiecīgi. Kur paplašinājumi nes funkcijas sistēmas komandām, palīdz disable_functions pareiza lietošana.
PHP2Shell gadījumā ievainojamības atrodas PHP kodolā, nevis paplašinājumā. Moduļu izslēgšana tās neaizver; vajadzīgs atjauninājums uz 8.5.12, 8.4.27, 8.3.36 vai 8.2.35 ar visu PHP procesu pārstartēšanu. Pēc atjauninājuma jāpārbauda, vai visi paplašinājumi atkal tiek ielādēti, jo trūkstoši moduļi bieži atklājas tikai pie noteiktām funkcijām. Kā atkarības uzturēt pastāvīgā kontrolē, apraksta Atkarību uzturēšana aktuālas.
Kā PHP SOS palīdz konkrēti?
- Apzināt esošo stāvokli: Mēs katrai SAPI uzskaitām visus ielādētos paplašinājumus ar izcelsmi un versiju.
- Iztīrīt: Mēs salīdzinām sarakstu ar jūsu lietojumprogrammas vajadzībām un lieko pēc testa deaktivizējam.
- Atjaunināt: Servera nostiprināšanas ietvaros mēs PHP un visus ārējos paplašinājumus novedam uzturētā stāvoklī.
- Pārbaudīt pēc atjauninājumiem: Mēs kontrolējam, ka pēc katra PHP atjauninājuma visi nepieciešamie moduļi atkal ir ielādēti.
Biežāk uzdotie jautājumi
Kāda ir atšķirība starp extension un zend_extension?
Ar extension PHP ielādē parastus paplašinājumus, piemēram, datubāzu draiverus. Ar zend_extension saskaņā ar rokasgrāmatu tiek ielādēti Zend paplašinājumi, kas dziļāk iejaucas dzinējā, piemēram, OPcache vai Xdebug. Abas direktīvas drīkst atrasties tikai php.ini.
Kā redzēt, kuri paplašinājumi ir ielādēti?
Komandrindā ar php -m, vietnei ar funkciju get_loaded_extensions() īslaicīgā pārbaudes failā vai ar attiecīgās versijas php-fpm -m. Ņemiet vērā, ka CLI un tīmekļa SAPI var ielādēt atšķirīgus paplašinājumus.
Kas ir PECL un kas ir PIE?
PECL ir PHP paplašinājumu direktorijs, ko nodrošina ar PEAR pakotņu sistēmu. Saskaņā ar PHP rokasgrāmatu PECL ir izsludināts par novecojušu; tā vietā iesaka PHP Installer for Extensions (PIE).
Vai paplašinājuma izslēgšana aizver PHP2Shell?
Nē. PHP2Shell ievainojamības atrodas PHP kodolā, nevis izslēdzamā paplašinājumā. Mazāk paplašinājumu vispārīgi samazina uzbrukuma virsmu, bet neaizstāj atjauninājumu uz labotu versiju.