Текуща ситуация: PHP2Shell. Две критични уязвимости в PHP (CVSS 9,2) позволяват злонамерен код без вход. Корекции от 21.10.2026 г.Какво да направите сега →

SAPI, обяснен: как PHP общува с уеб сървъра

SAPI е интерфейсът между PHP и уеб сървъра. Той определя как пристигат заявките, кой php.ini важи и какво трябва да се рестартира след актуализация.

Актуалност 5 мин. четенеЗнания за PHP

Накратко: SAPI означава Server Application Programming Interface, интерфейсът, чрез който PHP общува със средата си. Типични SAPI са fpm-fcgi (PHP-FPM), apache2handler (mod_php), cgi-fcgi (php-cgi), litespeed и cli за командния ред. SAPI определя как пристигат заявките, кой php.ini важи и кои процеси трябва да се рестартират след актуализация. При PHP2Shell от него зависи дори оценката на риска.

Какво е SAPI?

Самият PHP е програма, която изпълнява код. За да може да предоставя уебстраници, му е нужна връзка с уеб сървър, с командния ред или с друго приложение. Тази връзка е SAPI. Тя приема данните от заявката, предава ги на Zend Engine и връща изхода.

SAPI може да се представи като щепсел: двигателят остава същият, но според щепсела се включва към Apache, към Nginx през FastCGI, към LiteSpeed или към терминала. Всеки вариант има собствени силни страни, собствени пътища за конфигурация и собствени клопки.

SAPI решава преди всичко три неща, които имат значение в ежедневието:

  1. Модел на процесите: PHP работи ли в уеб сървъра, като самостоятелна услуга с постоянни работни процеси или като краткотраен процес за всяко извикване?
  2. Конфигурация: Кой php.ini се чете и къде могат да стоят допълнителни настройки, например в .htaccess, в .user.ini или в FPM пула?
  3. Права и разделяне: С кой потребител се изпълнява кодът и могат ли няколко уебсайта да бъдат разделени един от друг?

В хостинг панелите SAPI се появяват под други имена. Plesk например говори за PHP обработчици като „FPM application“, „FastCGI application“ или „Apache module“. Имат се предвид същите режими на работа, които описва тази страница. При съмнение помага проверочният файл по-долу, който показва действителното име на SAPI.

Какви PHP SAPI съществуват?

Ръководството на PHP назовава за php_sapi_name() между другото тези върнати стойности: apache, apache2handler, cgi (до PHP 5.3), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed и phpdbg. Списъкът изрично не е изчерпателен.

Име на SAPI Режим на работа Типично приложение Модел на процесите
fpm-fcgi PHP-FPM Nginx, Apache с proxy_fcgi, хостинг панели самостоятелна услуга с пулове от работни процеси
apache2handler mod_php по-стари Apache сървъри, прости Docker образи PHP в процеса на Apache
cgi-fcgi php-cgi стари инсталации, някои настройки с Windows процес за всяка заявка или FastCGI
litespeed LSAPI уеб сървър LiteSpeed, много споделени хостинги собствени PHP процеси
cli команден ред Cron задачи, Composer, скриптове за поддръжка един процес за всяко извикване
cli-server вграден уеб сървър само локална разработка (php -S) сървър за разработка
embed вграден PHP в други програми зависи от програмата
phpdbg дебъгер търсене на грешки интерактивен

FrankenPHP е съвременен сървър за приложения, който вгражда PHP директно. Той също е засегнат от PHP2Shell и има собствени пътища за актуализация; подробности в Защита на FrankenPHP.

Така проверявате SAPI на Вашия сървър

SAPI на един уебсайт можете да узнаете само през уеб сървъра, а не през командния ред. Достатъчен е малък проверочен файл:

<?php
// sapi-check.php: изтрийте го веднага след извикването
header('Content-Type: text/plain');
echo PHP_SAPI, "\n", PHP_VERSION, "\n", php_ini_loaded_file(), "\n";

В командния ред инсталираните варианти и услуги могат да се установят само с четене:

php -r 'echo PHP_SAPI, PHP_EOL;'          # винаги "cli"
ls /usr/sbin/php-fpm* 2>/dev/null           # инсталирани FPM версии
systemctl list-units --type=service | grep -i -E "php|lsws|apache2|httpd"
apachectl -M 2>/dev/null | grep -i php     # зареден ли е mod_php?

Защо всеки SAPI може да има собствен php.ini

Според ръководството на PHP PHP търси първо файл php-SAPI.ini, т.е. например php-cli.ini, и едва след това php.ini. Дистрибуции като Debian и Ubuntu отиват по-далеч и създават отделни директории за всеки SAPI, например /etc/php/8.3/fpm/ и /etc/php/8.3/cli/.

Различава се и моментът: при сървърните модули PHP според ръководството чете конфигурацията само веднъж при стартирането на уеб сървъра, при CGI и CLI при всяко извикване. Който променя настройка, трябва затова да знае кой SAPI е засегнат. Повече по темата в php.ini, обяснен.

SAPI и сигурност: какво показа PHP2Shell

Според съобщенията от PHP2Shell са засегнати PHP-FPM, Apache с mod_php, php-cgi, FrankenPHP и LiteSpeed. Екипът на PHP оценява риска при mod_php като най-висок, защото там е показан експлойт, преди да се изпълни код на приложението. Причините са описани в Защо mod_php носи най-високия риск.

За експлоатацията SAPI означава преди всичко едно: той определя какво трябва да се рестартира след актуализацията.

  1. PHP-FPM: всички пулове и работни процеси на всяка инсталирана версия
  2. mod_php: цялата услуга Apache, не само презареждане
  3. php-cgi и настройки с FastCGI: всички останали PHP процеси
  4. LiteSpeed: PHP процесите на уеб сървъра според указанията на доставчика
  5. CLI: няма постоянни процеси, но пакетът също се актуализира, за да са верни проверките

В средносрочен план си струва преходът от mod_php. Ръководството на PHP препоръчва за нови инсталации на Apache PHP-FPM с mod_proxy_fcgi. Основите са описани в PHP-FPM, обяснен.

Как помага PHP SOS конкретно?

  • Установяване на SAPI: Определяме за всеки сървър кои режими на работа и версии на PHP са действително активни.
  • Правилно рестартиране: Чрез услугата за PHP корекции актуализираме всеки SAPI и доказваме рестартирането на всички процеси.
  • Съотнасяне на конфигурацията: Показваме кой php.ini и кои настройки на пула важат за Вашия уебсайт.
  • Планиране на прехода: Където работи mod_php или php-cgi, планираме и тестваме преминаването към PHP-FPM.

Често задавани въпроси

Как да разбера кой SAPI използва моят уебсайт?

Най-надеждно е с кратковременно поставен проверочен файл, който извежда PHP_SAPI или php_sapi_name(), извикан през уеб сървъра. В командния ред винаги получавате cli, което не казва нищо за уебсайта. След това проверочният файл се изтрива веднага.

Кой SAPI е най-сигурният?

Никой не е сигурен сам по себе си. PHP-FPM обаче предлага най-много средства за разделяне: отделни пулове, потребители и заключени настройки за всеки уебсайт. Ръководството на PHP изрично препоръчва за нови инсталации на Apache PHP-FPM вместо mod_php.

Засегната ли е версията за команден ред от PHP2Shell?

Известните съобщения назовават PHP-FPM, mod_php, php-cgi, FrankenPHP и LiteSpeed. CLI не обработва заявки от мрежата. Тя обаче обикновено идва от същия източник на пакети и трябва винаги да се актуализира, дори само за да показват проверочните команди правилното състояние.

Може ли един сървър да ползва няколко SAPI едновременно?

Да, това дори е обичайно. Почти всеки сървър има освен уеб SAPI и CLI за Cron задачи и поддръжка. Често паралелно работят и няколко версии на PHP-FPM. Всяка от тях трябва да се актуализира и рестартира поотделно.

Източници

Незабавен контакт

Всеки час има значение. Пишете ни сега.

Опишете накратко системата, версията на PHP и какво сте забелязали. Ние се свързваме с Вас, уточняваме ситуацията и работим отдалечено, докато инцидентът бъде приключен и документиран.

Незабавна помощ