Trenutno stanje: PHP2Shell. Dve kritični ranljivosti PHP (CVSS 9,2) omogočata izvedbo škodljive kode brez prijave. Popravki od 21. 10. 2026.Kaj je zdaj treba storiti →

CGI in FastCGI: osnove

CGI za vsako zahtevo zažene proces, FastCGI procese ohranja pri življenju. Kaj to pomeni za PHP, php-cgi in PHP-FPM ter katere nastavitve zadevajo varnost.

Stanje 4 min branjaZnanje o PHP

Na kratko: CGI (Common Gateway Interface) je star vmesnik, pri katerem spletni strežnik za vsako zahtevo zažene nov program, pri PHP program php-cgi. FastCGI je nadaljnji razvoj: procesi PHP tečejo trajno in prek socketa sprejemajo veliko zahtev. PHP-FPM je najpomembnejša izvedba FastCGI za PHP. Za varnost so pomembne predvsem nastavitve cgi.* in pravilo, da dostop FastCGI ne sme biti nikoli javno dosegljiv.

Kaj je CGI?

CGI je ena najstarejših metod, s katerimi spletni strežniki ustvarjajo dinamične vsebine. Priročnik PHP pri nastavitvi cgi.rfc2616_headers napoti na RFC 3875, specifikacijo Common Gateway Interface. Tudi začetki PHP so bili programi CGI: Rasmus Lerdorf je leta 1994 prva „Personal Home Page Tools“ napisal kot binarne datoteke CGI v jeziku C.

Načelo: za vsako zahtevo spletni strežnik zažene nov proces, podatke zahteve preda prek spremenljivk okolja in standardnega vhoda ter odgovor prebere iz standardnega izhoda. Nato se proces konča. Po priročniku PHP pri CGI in CLI php.ini prebere ob vsakem klicu znova, pri strežniških modulih samo ob zagonu.

To naredi CGI robusten, ker vsaka zahteva začne s svežim procesom. Naredi pa ga tudi počasnega: zagon procesa, nalaganje konfiguracije in inicializacija razširitev ob vsaki zahtevi vzamejo čas.

Kaj je FastCGI?

FastCGI reši težavo zmogljivosti tako, da procesi ostanejo živi. Spletni strežnik se prek socketa Unix ali vrat TCP poveže s tekočim procesom in mu zahtevo pošlje v protokolu FastCGI. Proces jo obdela in počaka na naslednjo.

Značilnost CGI FastCGI s php-cgi FastCGI s PHP-FPM
Proces za vsako zahtevo da ne ne
Ime SAPI cgi-fcgi cgi-fcgi fpm-fcgi
Pooli z lastnim uporabnikom ne ne da
Upravljanje procesov spletni strežnik modul spletnega strežnika, npr. mod_fcgid lasten glavni proces (master)
.user.ini se prebere da da da

PHP-FPM je po priročniku primarna izvedba FastCGI v PHP. Protokol dopolnjuje z upravljanjem procesov, pooli, stranmi s stanjem in slowlogom. Podrobnosti so na strani PHP-FPM razložen.

Nastavitve cgi v php.ini

Za delovanje CGI PHP pozna lastne nastavitve. Naslednje vrednosti in opisi izvirajo iz priročnika PHP:

  1. cgi.force_redirect (privzeto 1, INI_SYSTEM): po priročniku potreben, da PHP kot CGI pod večino spletnih strežnikov teče varno. Izklopiti samo „na lastno odgovornost“; pod IIS mora biti izklopljen.
  2. cgi.fix_pathinfo (privzeto 1, INI_SYSTEM): poskrbi za pravilne vrednosti PATH_INFO in PATH_TRANSLATED. Skripte naj uporabljajo SCRIPT_FILENAME namesto PATH_TRANSLATED.
  3. cgi.discard_path (privzeto 0, INI_SYSTEM): omogoča, da se binarna datoteka CGI varno odloži zunaj spletnega imenika, ne da bi bilo mogoče zaobiti zaščito .htaccess.
  4. fastcgi.impersonate (privzeto 0, INI_SYSTEM): pomembno samo za IIS v sistemu Windows.
  5. user_ini.filename in user_ini.cache_ttl (privzeto .user.ini in 300 sekund): določata, ali in kako pogosto PHP bere datoteke .user.ini.

Pri Nginxu sodi zraven čista predaja poti do skripte. Berljiv osnovni vzorec, brez jamstva za vsako okolje:

location ~ \.php$ {
    try_files $uri =404;               # samo obstoječe datoteke predati PHP
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Vrstica try_files $uri =404; preprečuje, da bi se zahteve za neobstoječe poti .php posredovale PHP.

Zakaj je odprt dostop FastCGI nevaren

Priročnik PHP izrecno opozarja: kdor lahko odpre povezavo FastCGI do PHP, nadzoruje konfiguracijo zahteve, na primer auto_prepend_file, in lahko tako izvede poljubno kodo. Razlog je, da spletni strežniki smejo nastavitve PHP prek parametrov FastCGI, kot sta PHP_VALUE in PHP_ADMIN_VALUE, poslati zraven.

Iz tega izhajajo jasna pravila:

  • PHP-FPM ali php-cgi v načinu FastCGI povezati samo prek socketa Unix, če spletni strežnik teče na istem gostitelju.
  • Pri TCP nastaviti listen.allowed_clients in vrata zapreti v požarnem zidu; namigi v prispevku Požarni zid za spletne strežnike.
  • Pravice socketa držati ozke z listen.owner, listen.group in listen.mode.
Pomembno

Z ss -lntp | grep -i php preverite, ali kakšen proces PHP posluša na naslovu TCP. Vezava na 0.0.0.0 ali javni naslov je nujen primer za ukrepanje.

CGI, FastCGI in PHP2Shell

PHP2Shell prizadene tako php-cgi kot PHP-FPM. Za oba velja: posodobitev na 8.5.12, 8.4.27, 8.3.36 ali 8.2.35 oziroma potrjen backport, nato končati in znova zagnati vse tekoče procese PHP. Pri postavitvah FastCGI s php-cgi procesi pogosto neopazno tečejo naprej, ker jih ne upravlja nobena lastna storitev. Kako to staro breme najdete in odstranite, piše na strani php-cgi: staro breme s tveganjem. V Pleskovi nadzorni plošči se različice imenujejo drugače; pomaga Plesk: razumevanje handlerjev PHP.

Kako PHP SOS pomaga konkretno?

  • Zajem handlerjev: ugotovimo, ali vaše spletne strani tečejo prek CGI, FastCGI s php-cgi ali PHP-FPM.
  • Zapiranje dostopov: preverimo socket, vrata in pravila požarnega zidu, da noben dostop FastCGI ni dosegljiv od zunaj.
  • Popravljanje in čiščenje: posodobimo PHP in končamo vse stare procese, tudi osirotele primerke php-cgi.
  • Odstranitev: v okviru utrjevanja strežnika staro breme CGI zamenjamo s PHP-FPM z lastnimi pooli.

Pogosta vprašanja

Ali je FastCGI isto kot PHP-FPM?

Ne. FastCGI je protokol, prek katerega spletni strežnik komunicira z aplikacijskim procesom. PHP-FPM je program, ki ta protokol za PHP izvaja in upravlja procese. Tudi php-cgi zna govoriti FastCGI, a ne ponuja poolov.

Zakaj čisti CGI velja za zastarelega?

Pri CGI spletni strežnik za vsako zahtevo zažene nov proces, PHP pa pri tem vsakič prebere konfiguracijo. To stane čas in vire. FastCGI in PHP-FPM procese držita trajno pripravljene in sta zato občutno učinkovitejša.

Kaj je .user.ini?

Datoteka .user.ini je majhna konfiguracijska datoteka v spletnem imeniku. Po priročniku PHP jo berejo samo SAPI CGI in FastCGI, torej tudi PHP-FPM. Vsebuje lahko samo nastavitve z načini INI_PERDIR, INI_USER ali INI_ALL.

Kako prepoznam, ali na mojem strežniku teče php-cgi?

Z ukazi za branje, kot sta ps ali pgrep, poiščite procese z imenom php-cgi in v konfiguraciji spletnega strežnika poglejte vnose, kot so mod_fcgid, Action ali ScriptAlias s php-cgi. V panelih za gostovanje se način delovanja pogosto imenuje CGI ali aplikacija FastCGI.

Viri

Takojšnji stik

Vsaka ura šteje. Pišite nam zdaj.

Na kratko opišite sistem, različico PHP in opažanje. Odzovemo se, razjasnimo stanje in delamo na daljavo, dokler incident ni zaključen in dokumentiran.

Takojšnja pomoč