Krótko: SAPI to skrót od Server Application Programming Interface, czyli interfejsu, przez który PHP rozmawia ze swoim otoczeniem. Typowe SAPI to fpm-fcgi (PHP-FPM), apache2handler (mod_php), cgi-fcgi (php-cgi), litespeed i cli dla wiersza poleceń. SAPI określa, jak przychodzą żądania, który php.ini obowiązuje i które procesy po aktualizacji trzeba zrestartować. W przypadku PHP2Shell od niego zależy nawet ocena ryzyka.
Czym jest SAPI?
PHP samo w sobie jest programem, który wykonuje kod. Aby mogło wydawać strony internetowe, potrzebuje połączenia z serwerem WWW, z wierszem poleceń lub z inną aplikacją. Tym połączeniem jest SAPI. Przyjmuje dane żądania, przekazuje je do Zend Engine i zwraca wyjście.
SAPI można sobie wyobrazić jak wtyczkę: silnik pozostaje ten sam, ale zależnie od wtyczki pasuje do Apache, do Nginx przez FastCGI, do LiteSpeed albo do terminala. Każdy wariant ma własne mocne strony, własne ścieżki konfiguracji i własne pułapki.
SAPI decyduje przede wszystkim o trzech sprawach, które liczą się na co dzień:
- Model procesów: Czy PHP działa w serwerze WWW, jako osobna usługa ze stałymi workerami, czy jako krótkotrwały proces dla każdego wywołania?
- Konfiguracja: Który php.ini jest czytany i gdzie mogą znajdować się dodatkowe ustawienia, na przykład w
.htaccess, w.user.inilub w puli FPM? - Uprawnienia i rozdzielenie: Pod jakim użytkownikiem działa kod i czy można rozdzielić od siebie kilka stron?
W panelach hostingowych SAPI występują pod innymi nazwami. Plesk mówi na przykład o programach obsługi PHP, takich jak „FPM application”, „FastCGI application” czy „Apache module”. Chodzi o te same tryby pracy, które opisuje ta strona. W razie wątpliwości pomoże plik kontrolny poniżej, który pokazuje rzeczywistą nazwę SAPI.
Jakie istnieją SAPI PHP?
Podręcznik PHP wymienia dla php_sapi_name() między innymi takie wartości zwracane: apache, apache2handler, cgi (do PHP 5.3), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed i phpdbg. Lista jest wyraźnie niewyczerpująca.
| Nazwa SAPI | Tryb pracy | Typowe zastosowanie | Model procesów |
|---|---|---|---|
fpm-fcgi |
PHP-FPM | Nginx, Apache z proxy_fcgi, panele hostingowe |
osobna usługa z pulami workerów |
apache2handler |
mod_php | starsze serwery Apache, proste obrazy Docker | PHP w procesie Apache |
cgi-fcgi |
php-cgi | stare instalacje, niektóre konfiguracje Windows | proces na żądanie lub FastCGI |
litespeed |
LSAPI | serwer WWW LiteSpeed, wielu dostawców hostingu współdzielonego | własne procesy PHP |
cli |
wiersz poleceń | zadania Cron, Composer, skrypty konserwacyjne | jeden proces na wywołanie |
cli-server |
wbudowany serwer WWW | tylko lokalne programowanie (php -S) |
serwer deweloperski |
embed |
osadzone | PHP w innych programach | zależnie od programu |
phpdbg |
debugger | szukanie błędów | interaktywnie |
FrankenPHP to nowoczesny serwer aplikacji, który osadza PHP bezpośrednio. Jest również dotknięty przez PHP2Shell i ma własne ścieżki aktualizacji; szczegóły na stronie Zabezpieczanie FrankenPHP.
Jak sprawdzić SAPI Państwa serwera
SAPI strony można poznać tylko przez serwer WWW, nie przez wiersz poleceń. Wystarczy mały plik kontrolny:
<?php
// sapi-check.php: po wywołaniu natychmiast usunąć
header('Content-Type: text/plain');
echo PHP_SAPI, "\n", PHP_VERSION, "\n", php_ini_loaded_file(), "\n";
W wierszu poleceń można odczytać zainstalowane warianty i usługi, bez wprowadzania zmian:
php -r 'echo PHP_SAPI, PHP_EOL;' # zawsze "cli"
ls /usr/sbin/php-fpm* 2>/dev/null # zainstalowane wersje FPM
systemctl list-units --type=service | grep -i -E "php|lsws|apache2|httpd"
apachectl -M 2>/dev/null | grep -i php # czy mod_php jest załadowany?
Dlaczego każde SAPI może mieć własny php.ini
Według podręcznika PHP szuka najpierw pliku php-SAPI.ini, czyli na przykład php-cli.ini, a dopiero potem php.ini. Dystrybucje takie jak Debian i Ubuntu idą dalej i tworzą osobne katalogi dla każdego SAPI, na przykład /etc/php/8.3/fpm/ i /etc/php/8.3/cli/.
Różni się także moment odczytu: w modułach serwera PHP czyta konfigurację według podręcznika tylko raz przy starcie serwera WWW, w CGI i CLI przy każdym wywołaniu. Kto zmienia ustawienie, musi więc wiedzieć, którego SAPI ono dotyczy. Więcej na stronie php.ini wyjaśniony.
SAPI i bezpieczeństwo: czego nauczył PHP2Shell
Według komunikatów PHP2Shell dotyczy PHP-FPM, Apache z mod_php, php-cgi, FrankenPHP i LiteSpeed. Zespół PHP ocenia ryzyko w przypadku mod_php jako najwyższe, ponieważ pokazano tam exploit, zanim zacznie działać kod aplikacji. Powody podajemy na stronie Dlaczego mod_php niesie najwyższe ryzyko.
Dla eksploatacji SAPI oznacza przede wszystkim jedno: określa, co po aktualizacji trzeba zrestartować.
- PHP-FPM: wszystkie pule i workery każdej zainstalowanej wersji
- mod_php: cała usługa Apache, a nie tylko reload
- php-cgi i konfiguracje FastCGI: wszystkie pozostałe procesy PHP
- LiteSpeed: procesy PHP serwera WWW według instrukcji dostawcy
- CLI: brak procesów stałych, ale pakiet też trzeba zaktualizować, aby kontrole były zgodne ze stanem faktycznym
Z czasem warto odejść od mod_php. Podręcznik PHP zaleca dla nowych instalacji Apache PHP-FPM z mod_proxy_fcgi. Podstawy opisuje artykuł PHP-FPM wyjaśniony.
Jak konkretnie pomaga PHP SOS?
- Inwentaryzacja SAPI: Ustalamy dla każdego serwera, jakie tryby pracy i wersje PHP są faktycznie aktywne.
- Prawidłowy restart: W ramach usługi PHP Patch Service aktualizujemy każde SAPI i dokumentujemy restart wszystkich procesów.
- Przyporządkowanie konfiguracji: Pokazujemy, który php.ini i które ustawienia puli obowiązują dla Państwa strony.
- Planowanie przejścia: Tam, gdzie działa mod_php lub php-cgi, planujemy i testujemy przejście na PHP-FPM.
Częste pytania
Jak sprawdzić, jakiego SAPI używa moja strona?
Najpewniej za pomocą krótko umieszczonego pliku kontrolnego, który wypisuje PHP_SAPI lub php_sapi_name(), wywołanego przez serwer WWW. W wierszu poleceń zawsze otrzymają Państwo cli, co nic nie mówi o stronie. Po sprawdzeniu plik kontrolny należy od razu usunąć.
Które SAPI jest najbezpieczniejsze?
Żadne nie jest bezpieczne samo z siebie. PHP-FPM oferuje jednak najwięcej narzędzi do rozdzielania: osobne pule, użytkowników i zablokowane ustawienia dla każdej strony. Podręcznik PHP wyraźnie zaleca dla nowych instalacji Apache PHP-FPM zamiast mod_php.
Czy wersja PHP dla wiersza poleceń jest dotknięta przez PHP2Shell?
Znane komunikaty wymieniają PHP-FPM, mod_php, php-cgi, FrankenPHP i LiteSpeed. CLI nie przetwarza żądań z sieci. Zwykle pochodzi jednak z tego samego źródła pakietów i zawsze powinna być aktualizowana razem z resztą, choćby po to, aby polecenia kontrolne pokazywały właściwy stan.
Czy serwer może używać wielu SAPI jednocześnie?
Tak, to nawet normalne. Prawie każdy serwer ma obok SAPI webowego także CLI dla zadań Cron i konserwacji. Często równolegle działa dodatkowo kilka wersji PHP-FPM. Każdą z nich trzeba osobno zaktualizować i zrestartować.