Lühidalt: CGI (Common Gateway Interface) on vana liides, kus veebiserver käivitab iga päringu jaoks uue programmi, PHP puhul programmi php-cgi. FastCGI on selle edasiarendus: PHP protsessid töötavad püsivalt ja võtavad palju päringuid vastu sokli kaudu. PHP-FPM on PHP olulisim FastCGI teostus. Turvalisuse seisukohast on olulised eelkõige cgi.* sätted ja reegel, et FastCGI ligipääs ei tohi kunagi olla avalikult kättesaadav.
Mis on CGI?
CGI on üks vanimaid meetodeid, kuidas veebiserverid dünaamilist sisu loovad. PHP käsiraamat viitab sättega cgi.rfc2616_headers RFC 3875-le, Common Gateway Interface'i spetsifikatsioonile. Ka PHP algus oli CGI-programmid: Rasmus Lerdorf kirjutas 1994. aastal esimesed „Personal Home Page Toolsi“ CGI-binaarfailidena C-keeles.
Põhimõte: iga päringu jaoks käivitab veebiserver uue protsessi, annab päringuandmed edasi keskkonnamuutujate ja standardsisendi kaudu ning loeb vastuse standardväljundist. Seejärel protsess lõpeb. PHP käsiraamatu järgi loeb PHP CGI ja CLI puhul oma php.ini igal väljakutsel uuesti, servermoodulite puhul ainult käivitamisel.
See teeb CGI töökindlaks, sest iga päring algab värske protsessiga. Samas teeb see CGI aeglaseks: protsessi käivitamine, seadistuse laadimine ja laienduste lähtestamine maksavad igal päringul aega.
Mis on FastCGI?
FastCGI lahendab jõudlusprobleemi, hoides protsessid elus. Veebiserver ühendub Unixi sokli või TCP pordi kaudu töötava protsessiga ja saadab sellele päringu FastCGI protokollis. Protsess töötleb selle ja ootab järgmist.
| Tunnus | CGI | FastCGI php-cgi-ga | FastCGI PHP-FPM-iga |
|---|---|---|---|
| Protsess päringu kohta | jah | ei | ei |
| SAPI nimi | cgi-fcgi |
cgi-fcgi |
fpm-fcgi |
| Poolid oma kasutajaga | ei | ei | jah |
| Protsesside juhtimine | veebiserver | veebiserveri moodul, nt mod_fcgid | oma master-protsess |
.user.ini loetakse |
jah | jah | jah |
PHP-FPM on käsiraamatu järgi PHP peamine FastCGI teostus. See täiendab protokolli protsessihalduse, poolide, olekulehtede ja slowlogiga. Üksikasjad leiate lehelt PHP-FPM selgitus.
cgi sätted failis php.ini
CGI-töö jaoks tunneb PHP omi sätteid. Järgmised väärtused ja kirjeldused pärinevad PHP käsiraamatust:
cgi.force_redirect(vaikeväärtus 1,INI_SYSTEM): käsiraamatu järgi vajalik, et PHP-d CGI-na enamiku veebiserverite all turvaliselt käitada. Välja lülitada ainult „omal vastutusel“; IIS-is peab see olema välja lülitatud.cgi.fix_pathinfo(vaikeväärtus 1,INI_SYSTEM): tagab õigedPATH_INFOjaPATH_TRANSLATEDväärtused. Skriptid peaksid kasutamaPATH_TRANSLATEDasemelSCRIPT_FILENAME.cgi.discard_path(vaikeväärtus 0,INI_SYSTEM): lubab CGI binaarfaili turvaliselt veebikataloogist väljapoole paigutada, ilma et.htaccesskaitsest mööda saaks minna.fastcgi.impersonate(vaikeväärtus 0,INI_SYSTEM): asjakohane ainult IIS-ile Windowsis.user_ini.filenamejauser_ini.cache_ttl(vaikeväärtused.user.inija 300 sekundit): juhivad, kas ja kui tihti PHP.user.inifaile loeb.
Nginxi puhul kuulub siia skriptitee korrektne edastamine. Loetav põhimuster, ilma garantiita igale keskkonnale:
location ~ \.php$ {
try_files $uri =404; # anna PHP-le ainult olemasolevad failid
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Rida try_files $uri =404; takistab, et päringud olematutele .php teedele PHP-le edasi antaks.
Miks avatud FastCGI ligipääs on ohtlik
PHP käsiraamat hoiatab selgesõnaliselt: kes saab avada FastCGI ühenduse PHP-ga, kontrollib päringu seadistust, näiteks auto_prepend_file, ja saab seega käivitada suvalist koodi. Põhjus on selles, et veebiserverid tohivad PHP sätteid FastCGI parameetritega nagu PHP_VALUE ja PHP_ADMIN_VALUE kaasa saata.
Sellest tulenevad selged reeglid:
- Ühendage PHP-FPM või FastCGI-režiimis php-cgi Unixi sokli kaudu, kui veebiserver töötab samal hostil.
- TCP puhul seadke
listen.allowed_clientsja sulgege port tulemüüris; vihjed leiate artiklist Veebiserveri tulemüür. - Hoidke sokli õigused
listen.owner,listen.groupjalisten.modekaudu kitsad.
Kontrollige käsuga ss -lntp | grep -i php, kas mõni PHP protsess kuulab TCP aadressil. Sidumine aadressiga 0.0.0.0 või avaliku aadressiga on kiireloomuline tegutsemisjuhtum.
CGI, FastCGI ja PHP2Shell
PHP2Shell mõjutab nii php-cgi-d kui ka PHP-FPM-i. Mõlema kohta kehtib: uuendus versioonile 8.5.12, 8.4.27, 8.3.36 või 8.2.35 või kinnitatud backport, seejärel kõik töötavad PHP protsessid lõpetada ja uuesti käivitada. php-cgi-ga FastCGI seadistuste puhul töötavad protsessid sageli märkamatult edasi, sest ükski eraldi teenus neid ei halda. Kuidas seda vana koormat leida ja asendada, leiate lehelt php-cgi: risk vanas koormas. Pleskis kannavad variandid teisi nimesid; abi annab Plesk: PHP käsitlejate mõistmine.
Kuidas PHP SOS konkreetselt aitab?
- Käsitlejate kaardistamine: Selgitame välja, kas teie veebisaidid töötavad CGI, FastCGI koos php-cgi-ga või PHP-FPM-i kaudu.
- Ligipääsude sulgemine: Kontrollime sokleid, porte ja tulemüürireegleid, et ükski FastCGI ligipääs ei oleks väljastpoolt kättesaadav.
- Paikamine ja koristamine: Uuendame PHP-d ja lõpetame kõik vanad protsessid, ka orvuks jäänud php-cgi eksemplarid.
- Asendamine: Serveri karastamise raames asendame CGI vana koormat PHP-FPM-iga oma pooliga.
Korduma kippuvad küsimused
Kas FastCGI on sama mis PHP-FPM?
Ei. FastCGI on protokoll, mille kaudu veebiserver rakendusprotsessiga suhtleb. PHP-FPM on programm, mis teostab selle protokolli PHP jaoks ja haldab protsesse. Ka php-cgi oskab FastCGI-d rääkida, kuid ei paku poole.
Miks peetakse puhast CGI-d vananenuks?
CGI puhul käivitab veebiserver iga päringu jaoks uue protsessi ja PHP loeb iga kord oma seadistuse. See maksab aega ja ressursse. FastCGI ja PHP-FPM hoiavad protsesse püsivalt valmis ja on seetõttu märksa tõhusamad.
Mis on .user.ini?
Fail .user.ini on väike seadistusfail veebikataloogis. PHP käsiraamatu järgi loevad seda ainult CGI ja FastCGI SAPI-d, seega ka PHP-FPM. Selles tohib olla ainult sätteid režiimidega INI_PERDIR, INI_USER või INI_ALL.
Kuidas ma tean, kas minu serveris töötab php-cgi?
Otsige lugevate käskudega nagu ps või pgrep protsesse nimega php-cgi ja vaadake veebiserveri seadistuses kirjeid nagu mod_fcgid, Action või ScriptAlias koos php-cgi-ga. Majutuspaneelides kannab töörežiim sageli nime CGI või FastCGI application.