Pe scurt: SAPI înseamnă Server Application Programming Interface, interfața prin care PHP comunică cu mediul său. SAPI-uri tipice sunt fpm-fcgi (PHP-FPM), apache2handler (mod_php), cgi-fcgi (php-cgi), litespeed și cli pentru linia de comandă. SAPI determină cum ajung cererile, ce php.ini se aplică și ce procese trebuie repornite după o actualizare. La PHP2Shell, de ea depinde chiar și încadrarea riscului.
Ce este un SAPI?
PHP însuși este un program care execută cod. Pentru a putea livra pagini web, are nevoie de o legătură cu un server web, cu linia de comandă sau cu o altă aplicație. Această legătură este SAPI. Ea primește datele cererii, le transmite către Zend Engine și returnează ieșirea.
Vă puteți imagina SAPI ca pe un ștecher: motorul rămâne același, dar în funcție de ștecher se potrivește la Apache, la Nginx prin FastCGI, la LiteSpeed sau la terminal. Fiecare variantă are punctele ei forte, propriile căi de configurare și propriile capcane.
SAPI decide mai ales asupra a trei lucruri care contează în practică:
- Modelul de procese: Rulează PHP în serverul web, ca serviciu separat cu workeri permanenți sau ca proces de scurtă durată pentru fiecare apel?
- Configurația: Ce php.ini este citit și unde pot fi setări suplimentare, de exemplu în
.htaccess, într-un.user.inisau în pool-ul FPM? - Drepturi și separare: Sub ce utilizator rulează codul și pot fi separate mai multe site-uri unele de altele?
În panourile de hosting, SAPI apar sub alte nume. Plesk vorbește, de exemplu, de handlere PHP precum „FPM application”, „FastCGI application” sau „Apache module”. Sunt aceleași moduri de operare descrise pe această pagină. La nevoie, ajută fișierul de verificare de mai jos, care afișează numele real al SAPI.
Ce SAPI-uri PHP există?
Manualul PHP menționează pentru php_sapi_name(), printre altele, aceste valori returnate: apache, apache2handler, cgi (până la PHP 5.3), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed și phpdbg. Lista nu este, în mod explicit, exhaustivă.
| Nume SAPI | Mod de operare | Utilizare tipică | Model de procese |
|---|---|---|---|
fpm-fcgi |
PHP-FPM | Nginx, Apache cu proxy_fcgi, panouri de hosting |
serviciu separat cu pool-uri de workeri |
apache2handler |
mod_php | servere Apache mai vechi, imagini Docker simple | PHP în procesul Apache |
cgi-fcgi |
php-cgi | instalări vechi, unele configurații Windows | proces pentru fiecare cerere sau FastCGI |
litespeed |
LSAPI | server web LiteSpeed, mulți furnizori de shared hosting | procese PHP proprii |
cli |
linia de comandă | cronjob-uri, Composer, scripturi de mentenanță | un proces pentru fiecare apel |
cli-server |
server web integrat | doar dezvoltare locală (php -S) |
un server de dezvoltare |
embed |
încorporat | PHP în alte programe | în funcție de program |
phpdbg |
depanator | căutarea erorilor | interactiv |
FrankenPHP este un server de aplicații modern care încorporează PHP direct. Este de asemenea afectat de PHP2Shell și are căi proprii de actualizare; detalii la Securizarea FrankenPHP.
Cum verificați SAPI-ul serverului dumneavoastră
SAPI-ul unui site îl aflați doar prin serverul web, nu prin linia de comandă. Un mic fișier de verificare este suficient:
<?php
// sapi-check.php: ștergeți-l imediat după apelare
header('Content-Type: text/plain');
echo PHP_SAPI, "\n", PHP_VERSION, "\n", php_ini_loaded_file(), "\n";
În linia de comandă, variantele și serviciile instalate pot fi aflate în modul doar de citire:
php -r 'echo PHP_SAPI, PHP_EOL;' # întotdeauna "cli"
ls /usr/sbin/php-fpm* 2>/dev/null # versiunile FPM instalate
systemctl list-units --type=service | grep -i -E "php|lsws|apache2|httpd"
apachectl -M 2>/dev/null | grep -i php # mod_php încărcat?
De ce fiecare SAPI poate avea propriul php.ini
Potrivit manualului PHP, PHP caută mai întâi un fișier php-SAPI.ini, deci de exemplu php-cli.ini, și abia apoi php.ini. Distribuții precum Debian și Ubuntu merg mai departe și creează directoare separate pentru fiecare SAPI, de exemplu /etc/php/8.3/fpm/ și /etc/php/8.3/cli/.
Diferă și momentul: la modulele de server, PHP citește configurația, potrivit manualului, o singură dată la pornirea serverului web, la CGI și CLI la fiecare apel. Cine modifică o setare trebuie deci să știe ce SAPI este afectat. Mai multe la php.ini explicat.
SAPI și securitate: ce a arătat PHP2Shell
Potrivit rapoartelor, PHP2Shell afectează PHP-FPM, Apache cu mod_php, php-cgi, FrankenPHP și LiteSpeed. Echipa PHP încadrează riscul cel mai sus la mod_php, deoarece acolo a fost demonstrat un exploit înainte ca vreun cod al aplicației să ruleze. Motivele se află la De ce mod_php prezintă cel mai mare risc.
Pentru operare, SAPI înseamnă mai ales un lucru: determină ce trebuie repornit după actualizare.
- PHP-FPM: toate pool-urile și toți workerii fiecărei versiuni instalate
- mod_php: întregul serviciu Apache, nu doar un reload
- php-cgi și configurațiile FastCGI: toate procesele PHP rămase
- LiteSpeed: procesele PHP ale serverului web, conform instrucțiunilor furnizorului
- CLI: nu sunt procese permanente, dar actualizați și pachetul, pentru ca verificările să fie corecte
Pe termen mediu merită trecerea de la mod_php. Manualul PHP recomandă pentru instalările Apache noi PHP-FPM cu mod_proxy_fcgi. Bazele le descrie PHP-FPM explicat.
Cum ajută PHP SOS concret?
- Inventarierea SAPI: Stabilim pentru fiecare server ce moduri de operare și ce versiuni PHP sunt efectiv active.
- Repornire corectă: Prin serviciul de patch PHP actualizăm fiecare SAPI și dovedim repornirea tuturor proceselor.
- Atribuirea configurației: Arătăm ce php.ini și ce setări de pool se aplică site-ului dumneavoastră.
- Planificarea trecerii: Acolo unde rulează mod_php sau php-cgi, planificăm și testăm trecerea la PHP-FPM.
Întrebări frecvente
Cum aflu ce SAPI folosește site-ul meu?
Cel mai sigur cu un fișier de verificare depus pentru scurt timp, care afișează PHP_SAPI sau php_sapi_name() și este apelat prin serverul web. În linia de comandă obțineți mereu cli, ceea ce nu spune nimic despre site. Apoi ștergeți imediat fișierul de verificare.
Care SAPI este cel mai sigur?
Niciunul nu este sigur de la sine. PHP-FPM oferă însă cele mai multe instrumente de separare: pool-uri proprii, utilizatori și setări blocate pentru fiecare site. Manualul PHP recomandă explicit PHP-FPM în locul mod_php pentru instalările Apache noi.
Este afectată de PHP2Shell versiunea PHP din linia de comandă?
Rapoartele cunoscute menționează PHP-FPM, mod_php, php-cgi, FrankenPHP și LiteSpeed. CLI nu procesează cereri din rețea. De obicei provine însă din aceeași sursă de pachete și ar trebui actualizat mereu, chiar și numai pentru ca verificările să arate starea corectă.
Poate un server să folosească mai multe SAPI simultan?
Da, este chiar obișnuit. Aproape orice server are, pe lângă SAPI-ul web, CLI pentru cronjob-uri și mentenanță. Adesea rulează suplimentar în paralel mai multe versiuni PHP-FPM. Fiecare trebuie actualizată și repornită separat.