Röviden: A SAPI a Server Application Programming Interface rövidítése, vagyis az a felület, amelyen keresztül a PHP a környezetével kommunikál. Tipikus SAPI-k az fpm-fcgi (PHP-FPM), az apache2handler (mod_php), a cgi-fcgi (php-cgi), a litespeed és a cli a parancssorhoz. A SAPI határozza meg, hogyan érkeznek a kérések, melyik php.ini érvényes, és mely folyamatokat kell frissítés után újraindítani. A PHP2Shell esetében még a kockázati besorolás is ettől függ.
Mi az a SAPI?
A PHP maga egy program, amely kódot hajt végre. Hogy weboldalakat szolgáltathasson ki, kapcsolat kell egy webszerverhez, a parancssorhoz vagy egy másik alkalmazáshoz. Ez a kapcsolat a SAPI. Átveszi a kérés adatait, továbbadja a Zend Engine-nek, és visszaadja a kimenetet.
A SAPI-t egy csatlakozódugóhoz lehet hasonlítani: a motor ugyanaz marad, de a dugótól függően illeszkedik az Apache-hoz, FastCGI-n át az Nginxhez, a LiteSpeedhez vagy a terminálhoz. Minden változatnak megvannak a saját erősségei, konfigurációs útjai és buktatói.
A SAPI főként három, a mindennapokban számító dologról dönt:
- Folyamatmodell: A PHP a webszerverben fut, önálló szolgáltatásként tartós workerekkel, vagy hívásonként rövid életű folyamatként?
- Konfiguráció: Melyik php.ini kerül beolvasásra, és hol szerepelhetnek további beállítások, például a
.htaccess-ben, egy.user.ini-ben vagy az FPM-poolban? - Jogok és elkülönítés: Melyik felhasználó alatt fut a kód, és szétválaszthatók-e egymástól a weboldalak?
A tárhelyvezérlő paneleken a SAPI-k más néven jelennek meg. A Plesk például olyan PHP-kezelőkről beszél, mint a „FPM application”, a „FastCGI application” vagy az „Apache module”. Ugyanazokat az üzemmódokat jelentik, amelyeket ez az oldal ír le. Kétség esetén az alább látható ellenőrző fájl segít, amely a tényleges SAPI-nevet mutatja.
Milyen PHP-SAPI-k léteznek?
A PHP-kézikönyv a php_sapi_name() visszatérési értékei között többek közt ezeket említi: apache, apache2handler, cgi (a PHP 5.3-ig), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed és phpdbg. A lista kifejezetten nem teljes.
| SAPI-név | Üzemmód | Tipikus felhasználás | Folyamatmodell |
|---|---|---|---|
fpm-fcgi |
PHP-FPM | Nginx, Apache proxy_fcgi-vel, tárhelyvezérlő panelek |
önálló szolgáltatás worker-poolokkal |
apache2handler |
mod_php | régebbi Apache-szerverek, egyszerű Docker-képek | PHP az Apache-folyamatban |
cgi-fcgi |
php-cgi | régi telepítések, egyes Windows-beállítások | folyamat kérésenként vagy FastCGI |
litespeed |
LSAPI | LiteSpeed webszerver, sok megosztott tárhely | saját PHP-folyamatok |
cli |
parancssor | cron-feladatok, Composer, karbantartó szkriptek | egy folyamat hívásonként |
cli-server |
beépített webszerver | csak helyi fejlesztés (php -S) |
egy fejlesztői szerver |
embed |
beágyazott | PHP más programokban | a programtól függ |
phpdbg |
hibakereső | hibakeresés | interaktív |
A FrankenPHP egy modern alkalmazásszerver, amely közvetlenül beágyazza a PHP-t. Ezt is érinti a PHP2Shell, és saját frissítési útjai vannak; részletek a FrankenPHP védelme oldalon.
Így ellenőrizheti a szerver SAPI-ját
Egy weboldal SAPI-ját csak a webszerveren keresztül tudhatja meg, a parancssoron át nem. Egy kis ellenőrző fájl elég:
<?php
// sapi-check.php: a meghívás után azonnal törölje
header('Content-Type: text/plain');
echo PHP_SAPI, "\n", PHP_VERSION, "\n", php_ini_loaded_file(), "\n";
A parancssorban a telepített változatok és szolgáltatások csak olvasva felmérhetők:
php -r 'echo PHP_SAPI, PHP_EOL;' # mindig "cli"
ls /usr/sbin/php-fpm* 2>/dev/null # telepített FPM-verziók
systemctl list-units --type=service | grep -i -E "php|lsws|apache2|httpd"
apachectl -M 2>/dev/null | grep -i php # a mod_php be van töltve?
Miért lehet minden SAPI-nak saját php.ini-je
A PHP-kézikönyv szerint a PHP először egy php-SAPI.ini nevű fájlt keres, például php-cli.ini-t, és csak azután a php.ini-t. Az olyan disztribúciók, mint a Debian és az Ubuntu, ennél tovább mennek, és SAPI-nként külön könyvtárakat hoznak létre, például /etc/php/8.3/fpm/ és /etc/php/8.3/cli/.
Az időpont is eltér: szervermodulok esetén a PHP a kézikönyv szerint a konfigurációt csak a webszerver indításakor olvassa be egyszer, CGI és CLI esetén minden híváskor. Aki egy beállítást módosít, ezért tudnia kell, melyik SAPI-t érinti. Bővebben: A php.ini elmagyarázva.
SAPI és biztonság: amit a PHP2Shell megmutatott
A jelentések szerint a PHP2Shell a PHP-FPM-et, az Apache-ot mod_php-vel, a php-cgi-t, a FrankenPHP-t és a LiteSpeedet érinti. A PHP-csapat a kockázatot a mod_php esetén értékeli a legmagasabbra, mert ott még azelőtt bemutattak egy exploitot, hogy alkalmazáskód futna. Az okok a Miért a legmagasabb a mod_php kockázata oldalon olvashatók.
Az üzemeltetés szempontjából a SAPI elsősorban egyet jelent: meghatározza, mit kell a frissítés után újraindítani.
- PHP-FPM: minden telepített verzió összes poolja és workere
- mod_php: a teljes Apache-szolgáltatás, nem csak egy reload
- php-cgi és FastCGI-beállítások: az összes megmaradt PHP-folyamat
- LiteSpeed: a webszerver PHP-folyamatai a gyártó útmutatója szerint
- CLI: nincsenek tartós folyamatok, de a csomagot is frissíteni kell, hogy az ellenőrzések helyesek legyenek
Középtávon megéri a váltás a mod_php-ról. A PHP-kézikönyv új Apache-telepítésekhez a PHP-FPM-et ajánlja a mod_proxy_fcgi-vel. Az alapokat a PHP-FPM elmagyarázva oldal írja le.
Hogyan segít konkrétan a PHP SOS?
- SAPI-k felmérése: Minden szerverre megállapítjuk, mely üzemmódok és PHP-verziók aktívak ténylegesen.
- Helyes újraindítás: A PHP-javítási szolgáltatáson keresztül minden SAPI-t frissítünk, és igazoljuk az összes folyamat újraindítását.
- Konfiguráció hozzárendelése: Megmutatjuk, mely php.ini és mely poolbeállítások érvényesek az Ön weboldalára.
- Átállás tervezése: Ahol mod_php vagy php-cgi fut, megtervezzük és teszteljük a váltást PHP-FPM-re.
Gyakori kérdések
Hogyan tudom meg, melyik SAPI-t használja a weboldalam?
A legmegbízhatóbban egy rövid időre elhelyezett ellenőrző fájllal, amely kiírja a PHP_SAPI vagy a php_sapi_name() értékét, és a webszerveren keresztül hívják meg. A parancssorban mindig cli-t kap, ami a weboldalról semmit sem mond. Utána az ellenőrző fájlt azonnal törölje.
Melyik SAPI a legbiztonságosabb?
Egyik sem biztonságos önmagában. A PHP-FPM kínálja viszont a legtöbb elkülönítési eszközt: külön poolokat, felhasználókat és weboldalanként zárolt beállításokat. A PHP-kézikönyv új Apache-telepítésekhez kifejezetten a mod_php helyett a PHP-FPM-et ajánlja.
Érinti a PHP2Shell a PHP parancssori változatát?
Az ismert jelentések a PHP-FPM-et, a mod_php-t, a php-cgi-t, a FrankenPHP-t és a LiteSpeedet említik. A CLI nem dolgoz fel a hálózatról érkező kéréseket. Többnyire azonban ugyanabból a csomagforrásból származik, és mindig frissíteni kell, már csak azért is, hogy az ellenőrző parancsok a helyes állapotot mutassák.
Használhat egy szerver egyszerre több SAPI-t?
Igen, ez még szokásos is. Szinte minden szerveren a webes SAPI mellett ott van a CLI a cron-feladatokhoz és a karbantartáshoz. Gyakran több PHP-FPM-verzió is fut párhuzamosan. Mindegyiket külön kell frissíteni és újraindítani.