Ukratko: SAPI znači Server Application Programming Interface, sučelje putem kojeg PHP razgovara sa svojim okruženjem. Tipični SAPI-ji su fpm-fcgi (PHP-FPM), apache2handler (mod_php), cgi-fcgi (php-cgi), litespeed i cli za naredbeni redak. SAPI određuje kako zahtjevi stižu, koji php.ini vrijedi i koje procese treba ponovno pokrenuti nakon ažuriranja. Kod PHP2Shella o njemu ovisi čak i procjena rizika.
Što je SAPI?
PHP je sam po sebi program koji izvršava kod. Da bi mogao isporučivati web-stranice, treba vezu s web-poslužiteljem, naredbenim retkom ili nekom drugom aplikacijom. Ta veza je SAPI. Prima podatke zahtjeva, prosljeđuje ih Zend Engineu i vraća izlaz.
SAPI se može zamisliti kao utikač: motor ostaje isti, ali ovisno o utikaču pristaje na Apache, na Nginx putem FastCGI-ja, na LiteSpeed ili na terminal. Svaka izvedba ima vlastite prednosti, vlastite putove konfiguracije i vlastite zamke.
SAPI ponajprije odlučuje o tri stvari koje su važne u svakodnevici:
- Model procesa: Radi li PHP unutar web-poslužitelja, kao zasebna usluga s trajnim workerima ili kao kratkotrajan proces po pozivu?
- Konfiguracija: Koji se php.ini čita i gdje smiju stajati dodatne postavke, na primjer u
.htaccess, u.user.iniili u FPM poolu? - Prava i razdvajanje: Pod kojim korisnikom radi kod i mogu li se više web-stranica međusobno razdvojiti?
U hosting panelima SAPI-ji se pojavljuju pod drugim nazivima. Plesk, na primjer, govori o PHP rukovateljima poput „FPM application“, „FastCGI application“ ili „Apache module“. Misli se na iste načine rada koje opisuje ova stranica. U slučaju sumnje pomaže probna datoteka u nastavku, koja prikazuje stvarni naziv SAPI-ja.
Koji PHP SAPI-ji postoje?
PHP priručnik za php_sapi_name() među ostalim navodi ove povratne vrijednosti: apache, apache2handler, cgi (do PHP-a 5.3), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed i phpdbg. Popis izričito nije konačan.
| Naziv SAPI-ja | Način rada | Tipična uporaba | Model procesa |
|---|---|---|---|
fpm-fcgi |
PHP-FPM | Nginx, Apache s proxy_fcgi, hosting paneli |
zasebna usluga s poolovima workera |
apache2handler |
mod_php | stariji Apache poslužitelji, jednostavne Docker slike | PHP u Apacheovu procesu |
cgi-fcgi |
php-cgi | naslijeđene instalacije, neke Windows postavke | proces po zahtjevu ili FastCGI |
litespeed |
LSAPI | LiteSpeed web-poslužitelj, mnogi shared hosteri | vlastiti PHP procesi |
cli |
naredbeni redak | cron zadaci, Composer, skripte za održavanje | jedan proces po pozivu |
cli-server |
ugrađeni web-poslužitelj | samo lokalni razvoj (php -S) |
razvojni poslužitelj |
embed |
ugrađen | PHP u drugim programima | ovisi o programu |
phpdbg |
debugger | traženje pogrešaka | interaktivno |
FrankenPHP je moderan aplikacijski poslužitelj koji PHP izravno ugrađuje. Također je pogođen PHP2Shellom i ima vlastite putove ažuriranja; pojedinosti u članku Osiguravanje FrankenPHP-a.
Kako provjeriti SAPI svojeg poslužitelja
SAPI web-stranice saznajete samo putem web-poslužitelja, a ne putem naredbenog retka. Dovoljna je mala probna datoteka:
<?php
// sapi-check.php: nakon poziva odmah izbrisati
header('Content-Type: text/plain');
echo PHP_SAPI, "\n", PHP_VERSION, "\n", php_ini_loaded_file(), "\n";
U naredbenom retku instalirane izvedbe i usluge mogu se evidentirati samo čitanjem:
php -r 'echo PHP_SAPI, PHP_EOL;' # uvijek "cli"
ls /usr/sbin/php-fpm* 2>/dev/null # instalirane FPM verzije
systemctl list-units --type=service | grep -i -E "php|lsws|apache2|httpd"
apachectl -M 2>/dev/null | grep -i php # je li mod_php učitan?
Zašto svaki SAPI može imati vlastiti php.ini
Prema PHP priručniku PHP najprije traži datoteku php-SAPI.ini, dakle na primjer php-cli.ini, a tek potom php.ini. Distribucije poput Debiana i Ubuntua idu dalje i za svaki SAPI stvaraju vlastite mape, na primjer /etc/php/8.3/fpm/ i /etc/php/8.3/cli/.
Razlikuje se i trenutak: kod modula poslužitelja PHP konfiguraciju prema priručniku čita samo jednom pri pokretanju web-poslužitelja, kod CGI-ja i CLI-ja pri svakom pozivu. Tko mijenja postavku, mora stoga znati koji je SAPI pogođen. Više u članku php.ini objašnjen.
SAPI i sigurnost: što je pokazao PHP2Shell
Prema objavama PHP2Shellom su pogođeni PHP-FPM, Apache s mod_php-om, php-cgi, FrankenPHP i LiteSpeed. PHP tim rizik kod mod_php-a ocjenjuje najvišim jer je tamo pokazan exploit prije nego što se pokrene kod aplikacije. Razlozi su na stranici Zašto mod_php nosi najviši rizik.
Za rad SAPI znači ponajprije jedno: određuje što se nakon ažuriranja mora ponovno pokrenuti.
- PHP-FPM: svi poolovi i workeri svake instalirane verzije
- mod_php: cijela Apache usluga, ne samo reload
- php-cgi i FastCGI postavke: svi preostali PHP procesi
- LiteSpeed: PHP procesi web-poslužitelja prema uputama proizvođača
- CLI: nema trajnih procesa, ali paket ažurirajte zajedno s ostalima kako bi provjere bile točne
Srednjoročno se isplati prijeći s mod_php-a. PHP priručnik za nove instalacije Apachea preporučuje PHP-FPM s mod_proxy_fcgi. Osnove opisuje članak PHP-FPM objašnjen.
Kako PHP SOS konkretno pomaže?
- Evidentirati SAPI-je: Za svaki poslužitelj utvrđujemo koji su načini rada i PHP verzije stvarno aktivni.
- Ispravno ponovno pokrenuti: Putem PHP Patch usluge ažuriramo svaki SAPI i dokazujemo ponovno pokretanje svih procesa.
- Pridružiti konfiguraciju: Pokazujemo koji php.ini i koje postavke poola vrijede za Vašu web-stranicu.
- Planirati prelazak: Gdje radi mod_php ili php-cgi, planiramo i testiramo prelazak na PHP-FPM.
Česta pitanja
Kako saznati koji SAPI koristi moja web-stranica?
Najpouzdanije kratkotrajno postavljenom probnom datotekom koja ispisuje PHP_SAPI ili php_sapi_name() i poziva se putem web-poslužitelja. U naredbenom retku uvijek dobivate cli, što o web-stranici ne govori ništa. Probnu datoteku nakon toga odmah izbrišite.
Koji je SAPI najsigurniji?
Nijedan nije sam po sebi siguran. No PHP-FPM nudi najviše alata za razdvajanje: vlastite poolove, korisnike i zaključane postavke po web-stranici. PHP priručnik za nove instalacije Apachea izričito preporučuje PHP-FPM umjesto mod_php-a.
Pogađa li PHP2Shell inačicu PHP-a za naredbeni redak?
Poznate objave navode PHP-FPM, mod_php, php-cgi, FrankenPHP i LiteSpeed. CLI ne obrađuje zahtjeve iz mreže. No najčešće potječe iz istog izvora paketa i uvijek ga treba ažurirati zajedno s ostalima, već zato da naredbe za provjeru prikazuju ispravno stanje.
Može li poslužitelj istodobno koristiti više SAPI-ja?
Da, to je čak uobičajeno. Gotovo svaki poslužitelj uz web SAPI ima i CLI za cron zadatke i održavanje. Često usporedno rade i nekoliko verzija PHP-FPM-a. Svaku od njih treba zasebno ažurirati i ponovno pokrenuti.