Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

CGI a FastCGI: základy

CGI spúšťa pre každú požiadavku proces, FastCGI procesy udržiava nažive. Čo to znamená pre PHP, php-cgi a PHP-FPM a ktoré nastavenia sa týkajú bezpečnosti.

Stav 4 min čítaniaZnalosti o PHP

Stručne: CGI (Common Gateway Interface) je staré rozhranie, pri ktorom webový server pre každú požiadavku spúšťa nový program, pri PHP program php-cgi. FastCGI je jeho ďalší vývoj: procesy PHP bežia trvalo a prijímajú mnoho požiadaviek cez socket. PHP-FPM je najdôležitejšia implementácia FastCGI pre PHP. Z hľadiska bezpečnosti sú dôležité predovšetkým nastavenia cgi.* a pravidlo, že prístup FastCGI nesmie byť nikdy verejne dostupný.

Čo je CGI?

CGI je jedna z najstarších metód, ktorými webové servery vytvárajú dynamický obsah. Príručka PHP pri nastavení cgi.rfc2616_headers odkazuje na RFC 3875, špecifikáciu Common Gateway Interface. Aj začiatky PHP boli programy CGI: Rasmus Lerdorf napísal v roku 1994 prvé „Personal Home Page Tools“ ako binárne súbory CGI v jazyku C.

Princíp: pre každú požiadavku spustí webový server nový proces, odovzdá údaje požiadavky cez premenné prostredia a štandardný vstup a odpoveď číta zo štandardného výstupu. Potom proces skončí. Podľa príručky PHP číta PHP pri CGI a CLI svoj php.ini pri každom volaní znova, pri serverových moduloch iba pri štarte.

To robí CGI robustným, pretože každá požiadavka začína s čerstvým procesom. Robí ho to však aj pomalým: spustenie procesu, načítanie konfigurácie a inicializácia rozšírení stoja pri každej požiadavke čas.

Čo je FastCGI?

FastCGI rieši problém výkonu tým, že procesy zostávajú nažive. Webový server sa pripojí cez socket Unix alebo port TCP k bežiacemu procesu a pošle mu požiadavku v protokole FastCGI. Proces ju spracuje a čaká na ďalšiu.

Vlastnosť CGI FastCGI s php-cgi FastCGI s PHP-FPM
Proces na požiadavku áno nie nie
Názov SAPI cgi-fcgi cgi-fcgi fpm-fcgi
Pooly s vlastným používateľom nie nie áno
Riadenie procesov webový server modul webového servera, napr. mod_fcgid vlastný hlavný proces (master)
.user.ini sa číta áno áno áno

PHP-FPM je podľa príručky primárna implementácia FastCGI pre PHP. Dopĺňa protokol o správu procesov, pooly, stavové stránky a slowlog. Podrobnosti sú v časti PHP-FPM vysvetlené.

Nastavenia cgi v php.ini

Pre prevádzku CGI pozná PHP vlastné nastavenia. Nasledujúce hodnoty a opisy pochádzajú z príručky PHP:

  1. cgi.force_redirect (štandard 1, INI_SYSTEM): podľa príručky nutné na bezpečnú prevádzku PHP ako CGI pod väčšinou webových serverov. Vypnúť len „na vlastné riziko“; pod IIS musí byť vypnuté.
  2. cgi.fix_pathinfo (štandard 1, INI_SYSTEM): zabezpečuje správne hodnoty PATH_INFO a PATH_TRANSLATED. Skripty majú používať SCRIPT_FILENAME namiesto PATH_TRANSLATED.
  3. cgi.discard_path (štandard 0, INI_SYSTEM): umožňuje uložiť binárny súbor CGI bezpečne mimo webového adresára bez toho, aby sa dala obísť ochrana .htaccess.
  4. fastcgi.impersonate (štandard 0, INI_SYSTEM): relevantné len pre IIS vo Windows.
  5. user_ini.filename a user_ini.cache_ttl (štandard .user.ini a 300 sekúnd): riadia, či a ako často PHP číta súbory .user.ini.

Pri Nginx k tomu patrí čisté odovzdanie cesty ku skriptu. Čitateľný základný vzor, bez záruky pre každé prostredie:

location ~ \.php$ {
    try_files $uri =404;               # odovzdať PHP len existujúce súbory
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Riadok try_files $uri =404; bráni tomu, aby sa požiadavky na neexistujúce cesty .php odovzdávali ďalej PHP.

Prečo je otvorený prístup FastCGI nebezpečný

Príručka PHP výslovne varuje: kto môže otvoriť spojenie FastCGI s PHP, kontroluje konfiguráciu požiadavky, napríklad auto_prepend_file, a môže tak vykonať ľubovoľný kód. Dôvodom je, že webové servery smú posielať nastavenia PHP spolu s parametrami FastCGI ako PHP_VALUE a PHP_ADMIN_VALUE.

Z toho vyplývajú jasné pravidlá:

  • PHP-FPM alebo php-cgi v režime FastCGI zapájať iba cez socket Unix, ak webový server beží na tom istom hostiteľovi.
  • Pri TCP nastaviť listen.allowed_clients a port zablokovať vo firewalle; upozornenia k tomu sú v príspevku Firewall pre webové servery.
  • Práva socketu držať úzke pomocou listen.owner, listen.group a listen.mode.
Dôležité

Pomocou ss -lntp | grep -i php skontrolujte, či proces PHP nepočúva na adrese TCP. Väzba na 0.0.0.0 alebo verejnú adresu je naliehavý prípad na konanie.

CGI, FastCGI a PHP2Shell

PHP2Shell sa týka php-cgi aj PHP-FPM. Pre obe platí: aktualizácia na 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35, resp. potvrdený backport, potom ukončiť a znova spustiť všetky bežiace procesy PHP. Pri nastaveniach FastCGI s php-cgi často procesy nepozorovane bežia ďalej, pretože ich nespravuje žiadna samostatná služba. Ako túto záťaž z minulosti nájdete a nahradíte, je v časti php-cgi: záťaž z minulosti s rizikom. V Plesk sa varianty volajú inak; pomôže Plesk: porozumieť obslužným programom PHP.

Ako konkrétne pomáha PHP SOS?

  • Zmapovať handlery: Zisťujeme, či vaše weby bežia cez CGI, FastCGI s php-cgi alebo PHP-FPM.
  • Uzavrieť prístupy: Kontrolujeme sockety, porty a pravidlá firewallu, aby nebol žiadny prístup FastCGI dostupný zvonka.
  • Záplatovať a upratať: Aktualizujeme PHP a ukončíme všetky staré procesy, aj osirelé inštancie php-cgi.
  • Nahradiť: V rámci zabezpečenia servera (hardening) nahrádzame pozostatky CGI za PHP-FPM s vlastnými poolmi.

Časté otázky

Je FastCGI to isté ako PHP-FPM?

Nie. FastCGI je protokol, cez ktorý webový server komunikuje s aplikačným procesom. PHP-FPM je program, ktorý tento protokol pre PHP implementuje a spravuje procesy. Aj php-cgi vie hovoriť FastCGI, ale neponúka pooly.

Prečo sa čisté CGI považuje za zastarané?

Pri CGI spúšťa webový server pre každú požiadavku nový proces a PHP pritom zakaždým načítava svoju konfiguráciu. To stojí čas a zdroje. FastCGI a PHP-FPM držia procesy trvalo pripravené, a sú preto výrazne efektívnejšie.

Čo je .user.ini?

Súbor .user.ini je malý konfiguračný súbor vo webovom adresári. Podľa príručky PHP ho čítajú len SAPI CGI a FastCGI, teda aj PHP-FPM. Smie obsahovať iba nastavenia s režimami INI_PERDIR, INI_USER alebo INI_ALL.

Ako poznám, že na mojom serveri beží php-cgi?

Pomocou príkazov na čítanie, ako ps alebo pgrep, hľadajte procesy s názvom php-cgi a v konfigurácii webového servera hľadajte záznamy ako mod_fcgid, Action alebo ScriptAlias s php-cgi. V hostingových paneloch sa režim prevádzky často volá CGI alebo aplikácia FastCGI.

Zdroje

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc