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:
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é.cgi.fix_pathinfo(štandard 1,INI_SYSTEM): zabezpečuje správne hodnotyPATH_INFOaPATH_TRANSLATED. Skripty majú používaťSCRIPT_FILENAMEnamiestoPATH_TRANSLATED.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.fastcgi.impersonate(štandard 0,INI_SYSTEM): relevantné len pre IIS vo Windows.user_ini.filenameauser_ini.cache_ttl(štandard.user.inia 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_clientsa 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.groupalisten.mode.
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.