Ukratko: CGI (Common Gateway Interface) staro je sučelje kod kojeg web-poslužitelj za svaki zahtjev pokreće novi program, kod PHP-a program php-cgi. FastCGI je daljnji razvoj: PHP procesi rade trajno i putem socketa primaju mnogo zahtjeva. PHP-FPM najvažnija je FastCGI izvedba za PHP. Sigurnosno su važne ponajprije postavke cgi.* i pravilo da FastCGI pristup nikad ne smije biti javno dostupan.
Što je CGI?
CGI je jedna od najstarijih metoda kojom web-poslužitelji stvaraju dinamične sadržaje. PHP priručnik kod postavke cgi.rfc2616_headers upućuje na RFC 3875, specifikaciju Common Gateway Interfacea. I počeci PHP-a bili su CGI programi: Rasmus Lerdorf 1994. napisao je prve „Personal Home Page Tools“ kao CGI binarne datoteke u jeziku C.
Načelo: za svaki zahtjev web-poslužitelj pokreće novi proces, podatke zahtjeva predaje putem varijabli okoline i standardnog ulaza, a odgovor čita sa standardnog izlaza. Nakon toga proces završava. Prema PHP priručniku PHP kod CGI-ja i CLI-ja svoj php.ini pri svakom pozivu čita iznova, a kod modula poslužitelja samo pri pokretanju.
To CGI čini robusnim jer svaki zahtjev počinje sa svježim procesom. Ali ga čini i sporim: pokretanje procesa, učitavanje konfiguracije i inicijalizacija ekstenzija troše vrijeme pri svakom zahtjevu.
Što je FastCGI?
FastCGI rješava problem učinkovitosti tako što procesi ostaju na životu. Web-poslužitelj se putem Unix socketa ili TCP porta povezuje s pokrenutim procesom i šalje mu zahtjev u FastCGI protokolu. Proces ga obrađuje i čeka sljedeći.
| Obilježje | CGI | FastCGI s php-cgi | FastCGI s PHP-FPM |
|---|---|---|---|
| Proces po zahtjevu | da | ne | ne |
| Naziv SAPI-ja | cgi-fcgi |
cgi-fcgi |
fpm-fcgi |
| Poolovi s vlastitim korisnikom | ne | ne | da |
| Upravljanje procesima | web-poslužitelj | modul web-poslužitelja, npr. mod_fcgid | vlastiti master proces |
.user.ini se čita |
da | da | da |
PHP-FPM je prema priručniku primarna FastCGI implementacija PHP-a. Protokol nadopunjuje upravljanjem procesima, poolovima, stranicama statusa i slowlogom. Pojedinosti su u članku PHP-FPM objašnjen.
cgi postavke u php.ini
Za CGI rad PHP poznaje vlastite postavke. Sljedeće vrijednosti i opisi potječu iz PHP priručnika:
cgi.force_redirect(zadano 1,INI_SYSTEM): prema priručniku potrebno za siguran rad PHP-a kao CGI-ja pod većinom web-poslužitelja. Isključiti samo „na vlastiti rizik“; pod IIS-om mora biti isključeno.cgi.fix_pathinfo(zadano 1,INI_SYSTEM): osigurava ispravne vrijednostiPATH_INFOiPATH_TRANSLATED. Skripte trebaju koristitiSCRIPT_FILENAMEumjestoPATH_TRANSLATED.cgi.discard_path(zadano 0,INI_SYSTEM): omogućuje da se CGI binarna datoteka sigurno pohrani izvan web-direktorija, bez mogućnosti zaobilaženja zaštite putem.htaccess.fastcgi.impersonate(zadano 0,INI_SYSTEM): važno samo za IIS pod Windowsom.user_ini.filenameiuser_ini.cache_ttl(zadano.user.inii 300 sekundi): određuju čita li PHP datoteke.user.inii koliko često.
Kod Nginxa tome pripada uredno prosljeđivanje putanje skripte. Čitljiv osnovni uzorak, bez jamstva za svako okruženje:
location ~ \.php$ {
try_files $uri =404; # PHP-u predavati samo postojeće datoteke
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Redak try_files $uri =404; sprječava da se zahtjevi za nepostojećim .php putanjama prosljeđuju PHP-u.
Zašto je otvoren FastCGI pristup opasan
PHP priručnik izričito upozorava: tko može otvoriti FastCGI vezu prema PHP-u, kontrolira konfiguraciju zahtjeva, na primjer auto_prepend_file, i time može izvršiti proizvoljan kod. Razlog je što web-poslužitelji putem FastCGI parametara poput PHP_VALUE i PHP_ADMIN_VALUE smiju slati i PHP postavke.
Iz toga slijede jasna pravila:
- PHP-FPM ili php-cgi u FastCGI načinu povezivati samo putem Unix socketa ako web-poslužitelj radi na istom hostu.
- Kod TCP-a postaviti
listen.allowed_clientsi port blokirati vatrozidom; napomene u članku Vatrozid za web-poslužitelje. - Prava socketa držati uskima putem
listen.owner,listen.groupilisten.mode.
Pomoću ss -lntp | grep -i php provjerite sluša li neki PHP proces na TCP adresi. Vezanje na 0.0.0.0 ili javnu adresu hitan je slučaj za djelovanje.
CGI, FastCGI i PHP2Shell
PHP2Shellom su pogođeni i php-cgi i PHP-FPM. Za oba vrijedi: ažuriranje na 8.5.12, 8.4.27, 8.3.36 ili 8.2.35 odnosno potvrđeni backport, zatim završiti i ponovno pokrenuti sve pokrenute PHP procese. Kod FastCGI postavki s php-cgi procesi često neprimijećeno nastavljaju raditi jer ih ne vodi nijedna zasebna usluga. Kako pronaći i ukloniti to naslijeđe, piše na stranici php-cgi: naslijeđe s rizikom. U Pleskovima se izvedbe zovu drukčije; pomoć nudi članak Plesk: razumjeti PHP rukovatelje.
Kako PHP SOS konkretno pomaže?
- Evidentirati rukovatelje: Utvrđujemo rade li Vaše web-stranice putem CGI-ja, FastCGI-ja s php-cgi ili PHP-FPM-a.
- Zatvoriti pristupe: Provjeravamo socketove, portove i pravila vatrozida kako nijedan FastCGI pristup ne bi bio dostupan izvana.
- Zakrpati i pospremiti: Ažuriramo PHP i završavamo sve stare procese, uključujući zaostale php-cgi instance.
- Ukloniti: U okviru ojačavanja poslužitelja CGI naslijeđe zamjenjujemo PHP-FPM-om s vlastitim poolovima.
Česta pitanja
Je li FastCGI isto što i PHP-FPM?
Ne. FastCGI je protokol putem kojeg web-poslužitelj razgovara s procesom aplikacije. PHP-FPM je program koji taj protokol provodi za PHP i upravlja procesima. I php-cgi može govoriti FastCGI, ali ne nudi poolove.
Zašto se čisti CGI smatra zastarjelim?
Kod CGI-ja web-poslužitelj za svaki zahtjev pokreće novi proces, a PHP pritom svaki put čita svoju konfiguraciju. To košta vrijeme i resurse. FastCGI i PHP-FPM trajno drže procese spremnima i zato su znatno učinkovitiji.
Što je .user.ini?
Datoteka .user.ini mala je konfiguracijska datoteka u web-direktoriju. Prema PHP priručniku čitaju je samo CGI i FastCGI SAPI-ji, dakle i PHP-FPM. Smije sadržavati samo postavke s načinima INI_PERDIR, INI_USER ili INI_ALL.
Kako prepoznati radi li na mom poslužitelju php-cgi?
Naredbama samo za čitanje poput ps ili pgrep tražite procese naziva php-cgi i u konfiguraciji web-poslužitelja pogledajte unose poput mod_fcgid, Action ili ScriptAlias s php-cgi. U hosting panelima način rada često se zove CGI ili FastCGI aplikacija.