Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

CGI i FastCGI: osnove

CGI za svaki zahtjev pokreće proces, FastCGI procese drži na životu. Što to znači za PHP, php-cgi i PHP-FPM i koje postavke utječu na sigurnost.

Stanje 4 min čitanjaPHP znanje

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:

  1. 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.
  2. cgi.fix_pathinfo (zadano 1, INI_SYSTEM): osigurava ispravne vrijednosti PATH_INFO i PATH_TRANSLATED. Skripte trebaju koristiti SCRIPT_FILENAME umjesto PATH_TRANSLATED.
  3. 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.
  4. fastcgi.impersonate (zadano 0, INI_SYSTEM): važno samo za IIS pod Windowsom.
  5. user_ini.filename i user_ini.cache_ttl (zadano .user.ini i 300 sekundi): određuju čita li PHP datoteke .user.ini i 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_clients i port blokirati vatrozidom; napomene u članku Vatrozid za web-poslužitelje.
  • Prava socketa držati uskima putem listen.owner, listen.group i listen.mode.
Važno

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.

Izvori

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć