Lyhyesti: SAPI tarkoittaa Server Application Programming Interface, rajapintaa, jonka kautta PHP keskustelee ympäristönsä kanssa. Tyypillisiä SAPI:ja ovat fpm-fcgi (PHP-FPM), apache2handler (mod_php), cgi-fcgi (php-cgi), litespeed ja cli komentoriville. SAPI määrää, miten pyynnöt saapuvat, mikä php.ini on voimassa ja mitkä prosessit on päivityksen jälkeen käynnistettävä uudelleen. PHP2Shellin kohdalla riskiluokituskin riippuu siitä.
Mikä SAPI on?
PHP itse on ohjelma, joka suorittaa koodia. Jotta se voi tarjota verkkosivuja, se tarvitsee yhteyden verkkopalvelimeen, komentoriviin tai johonkin toiseen sovellukseen. Tämä yhteys on SAPI. Se ottaa vastaan pyyntötiedot, välittää ne Zend Enginelle ja palauttaa tulosteen.
SAPI:n voi kuvitella pistokkeeksi: moottori pysyy samana, mutta pistokkeesta riippuen se sopii Apacheen, Nginxiin FastCGI:n kautta, LiteSpeediin tai päätteeseen. Jokaisella vaihtoehdolla on omat vahvuutensa, omat konfigurointitiensä ja omat sudenkuoppansa.
SAPI ratkaisee ennen kaikkea kolme arjessa merkittävää asiaa:
- Prosessimalli: Toimiiko PHP verkkopalvelimen sisällä, omana palvelunaan pysyvine worker-prosesseineen vai lyhytikäisenä prosessina jokaista kutsua kohden?
- Konfiguraatio: Mikä php.ini luetaan, ja missä lisäasetukset saavat olla, esimerkiksi
.htaccess-tiedostossa,.user.ini-tiedostossa vai FPM-poolissa? - Oikeudet ja erottelu: Minkä käyttäjän alla koodi toimii, ja voiko useita verkkosivustoja erottaa toisistaan?
Hosting-paneeleissa SAPI:t esiintyvät muilla nimillä. Plesk puhuu esimerkiksi PHP-käsittelijöistä, kuten ”FPM application”, ”FastCGI application” tai ”Apache module”. Tarkoitetaan samoja ajotapoja, joita tämä sivu kuvaa. Epäselvässä tapauksessa auttaa alla oleva tarkistustiedosto, joka näyttää todellisen SAPI-nimen.
Mitä PHP-SAPI:ja on olemassa?
PHP-käsikirja mainitsee php_sapi_name()-funktion palautusarvoiksi muun muassa seuraavat: apache, apache2handler, cgi (PHP 5.3:een asti), cgi-fcgi, cli, cli-server, embed, fpm-fcgi, litespeed ja phpdbg. Luettelo ei ole nimenomaisesti tyhjentävä.
| SAPI-nimi | Ajotapa | Tyypillinen käyttö | Prosessimalli |
|---|---|---|---|
fpm-fcgi |
PHP-FPM | Nginx, Apache ja proxy_fcgi, hosting-paneelit |
oma palvelu worker-pooleineen |
apache2handler |
mod_php | vanhemmat Apache-palvelimet, yksinkertaiset Docker-levykuvat | PHP Apache-prosessissa |
cgi-fcgi |
php-cgi | vanhat asennukset, jotkin Windows-ympäristöt | prosessi pyyntöä kohden tai FastCGI |
litespeed |
LSAPI | LiteSpeed-verkkopalvelin, monet jaetun hostingin tarjoajat | omat PHP-prosessit |
cli |
komentorivi | cron-tehtävät, Composer, huoltokomentosarjat | yksi prosessi kutsua kohden |
cli-server |
sisäänrakennettu verkkopalvelin | vain paikallinen kehitys (php -S) |
yksi kehityspalvelin |
embed |
upotettu | PHP muissa ohjelmissa | ohjelmasta riippuva |
phpdbg |
debuggeri | virheiden etsintä | interaktiivinen |
FrankenPHP on moderni sovelluspalvelin, joka upottaa PHP:n suoraan. Myös se on PHP2Shellin vaikutuspiirissä ja sillä on omat päivitystiensä; yksityiskohdat sivulla FrankenPHP:n suojaus.
Näin tarkistatte palvelimenne SAPI:n
Verkkosivuston SAPI selviää vain verkkopalvelimen kautta, ei komentoriviltä. Pieni tarkistustiedosto riittää:
<?php
// sapi-check.php: poista heti kutsun jälkeen
header('Content-Type: text/plain');
echo PHP_SAPI, "\n", PHP_VERSION, "\n", php_ini_loaded_file(), "\n";
Komentorivillä asennetut variantit ja palvelut voi kartoittaa vain lukemalla:
php -r 'echo PHP_SAPI, PHP_EOL;' # aina "cli"
ls /usr/sbin/php-fpm* 2>/dev/null # asennetut FPM-versiot
systemctl list-units --type=service | grep -i -E "php|lsws|apache2|httpd"
apachectl -M 2>/dev/null | grep -i php # onko mod_php ladattu?
Miksi jokaisella SAPI:lla voi olla oma php.ini
PHP-käsikirjan mukaan PHP etsii ensin tiedostoa php-SAPI.ini, esimerkiksi php-cli.ini, ja vasta sen jälkeen tiedostoa php.ini. Jakelut, kuten Debian ja Ubuntu, menevät pidemmälle ja luovat jokaiselle SAPI:lle omat kansionsa, esimerkiksi /etc/php/8.3/fpm/ ja /etc/php/8.3/cli/.
Myös ajankohta vaihtelee: palvelinmoduuleissa PHP lukee käsikirjan mukaan konfiguraation vain kerran verkkopalvelimen käynnistyessä, CGI:ssä ja CLI:ssä jokaisella kutsulla. Asetusta muuttavan on siksi tiedettävä, mitä SAPI:a muutos koskee. Lisää sivulla php.ini selitettynä.
SAPI ja tietoturva: mitä PHP2Shell on osoittanut
Tiedotteiden mukaan PHP2Shell koskee PHP-FPM:ää, Apachea mod_php:n kanssa, php-cgi:tä, FrankenPHP:tä ja LiteSpeediä. PHP-tiimi arvioi riskin korkeimmaksi mod_php:ssä, koska siinä on esitetty hyökkäys, joka toimii ennen kuin sovelluskoodia ajetaan. Perustelut ovat sivulla Miksi mod_php:n riski on suurin.
Käytön kannalta SAPI määrää ennen kaikkea yhden asian: mitä päivityksen jälkeen on käynnistettävä uudelleen.
- PHP-FPM: kaikki poolit ja worker-prosessit jokaisessa asennetussa versiossa
- mod_php: koko Apache-palvelu, ei pelkkä reload
- php-cgi ja FastCGI-ympäristöt: kaikki jäljellä olevat PHP-prosessit
- LiteSpeed: verkkopalvelimen PHP-prosessit toimittajan ohjeen mukaan
- CLI: ei pysyviä prosesseja, mutta paketti päivitetään mukana, jotta tarkistukset pitävät paikkansa
Keskipitkällä aikavälillä siirtymä pois mod_php:stä kannattaa. PHP-käsikirja suosittelee uusille Apache-asennuksille PHP-FPM:ää ja mod_proxy_fcgi-moduulia. Perusteet kuvaa sivu PHP-FPM selitettynä.
Miten PHP SOS auttaa konkreettisesti?
- SAPI:en kartoitus: Selvitämme jokaiselle palvelimelle, mitkä ajotavat ja PHP-versiot ovat todella aktiivisia.
- Uudelleenkäynnistys oikein: PHP-päivityspalvelun kautta päivitämme jokaisen SAPI:n ja osoitamme kaikkien prosessien uudelleenkäynnistyksen.
- Konfiguraation kohdistus: Näytämme, mikä php.ini ja mitkä poolin asetukset koskevat verkkosivustoanne.
- Siirtymän suunnittelu: Missä mod_php tai php-cgi on käytössä, suunnittelemme ja testaamme siirtymän PHP-FPM:ään.
Usein kysytyt kysymykset
Miten selvitän, mitä SAPI:a verkkosivustoni käyttää?
Luotettavimmin tilapäisesti sijoitetulla tarkistustiedostolla, joka tulostaa PHP_SAPI tai php_sapi_name() ja jota kutsutaan verkkopalvelimen kautta. Komentorivillä saatte aina arvon cli, mikä ei kerro verkkosivustosta mitään. Poistakaa tarkistustiedosto heti sen jälkeen.
Mikä SAPI on turvallisin?
Mikään ei ole itsessään turvallinen. PHP-FPM tarjoaa kuitenkin eniten erottelun työkaluja: omat poolit, käyttäjät ja lukitut asetukset kullekin verkkosivustolle. PHP-käsikirja neuvoo uusille Apache-asennuksille nimenomaan PHP-FPM:ää mod_php:n sijaan.
Koskeeko PHP2Shell PHP:n komentoriviversiota?
Tunnetuissa tiedotteissa mainitaan PHP-FPM, mod_php, php-cgi, FrankenPHP ja LiteSpeed. CLI ei käsittele pyyntöjä verkosta. Se tulee kuitenkin yleensä samasta pakettilähteestä, ja se kannattaa aina päivittää mukana, jo siksi että tarkistuskomennot näyttävät oikean tilan.
Voiko palvelin käyttää useita SAPI:ja samanaikaisesti?
Voi, se on jopa tavallista. Lähes jokaisella palvelimella on verkko-SAPI:n lisäksi CLI cron-tehtäviä ja ylläpitoa varten. Usein lisäksi useita PHP-FPM-versioita pyörii rinnakkain. Jokainen niistä on päivitettävä ja käynnistettävä uudelleen erikseen.