Situația actuală: PHP2Shell. Două vulnerabilități critice PHP (CVSS 9.2) permit cod malițios fără autentificare. Patchuri din 21.10.2026.Ce este de făcut acum →

CGI și FastCGI: bazele

CGI pornește un proces pentru fiecare cerere, FastCGI ține procesele în viață. Ce înseamnă asta pentru PHP, php-cgi și PHP-FPM și ce setări afectează securitatea.

Stadiu 4 min de cititCunoștințe PHP

Pe scurt: CGI (Common Gateway Interface) este o interfață veche, în care serverul web pornește un program nou pentru fiecare cerere, la PHP programul php-cgi. FastCGI este evoluția: procesele PHP rulează permanent și primesc multe cereri printr-un socket. PHP-FPM este cea mai importantă implementare FastCGI pentru PHP. Relevante pentru securitate sunt mai ales setările cgi.* și regula că un acces FastCGI nu trebuie să fie niciodată accesibil public.

Ce este CGI?

CGI este una dintre cele mai vechi metode prin care serverele web generează conținut dinamic. Manualul PHP trimite, la setarea cgi.rfc2616_headers, la RFC 3875, specificația Common Gateway Interface. Și începuturile PHP au fost programe CGI: Rasmus Lerdorf a scris în 1994 primele „Personal Home Page Tools” ca fișiere binare CGI în C.

Principiul: pentru fiecare cerere, serverul web pornește un proces nou, transmite datele cererii prin variabile de mediu și intrarea standard și citește răspunsul din ieșirea standard. Apoi procesul se încheie. Potrivit manualului PHP, la CGI și CLI, PHP își citește php.ini din nou la fiecare apel, la modulele de server doar la pornire.

Asta face CGI robust, pentru că fiecare cerere începe cu un proces proaspăt. Dar îl face și lent: pornirea procesului, încărcarea configurației și inițializarea extensiilor costă timp la fiecare cerere.

Ce este FastCGI?

FastCGI rezolvă problema de performanță ținând procesele în viață. Serverul web se conectează printr-un socket Unix sau un port TCP la un proces care rulează și îi trimite cererea în protocolul FastCGI. Procesul o prelucrează și așteaptă următoarea.

Caracteristică CGI FastCGI cu php-cgi FastCGI cu PHP-FPM
Proces pentru fiecare cerere da nu nu
Nume SAPI cgi-fcgi cgi-fcgi fpm-fcgi
Pool-uri cu utilizator propriu nu nu da
Controlul proceselor serverul web modul al serverului web, de ex. mod_fcgid proces master propriu
.user.ini este citit da da da

PHP-FPM este, potrivit manualului, implementarea FastCGI principală a PHP. Completează protocolul cu administrarea proceselor, pool-uri, pagini de stare și un slowlog. Detaliile se află la PHP-FPM explicat.

Setările cgi din php.ini

Pentru funcționarea CGI, PHP are setări proprii. Valorile și descrierile următoare provin din manualul PHP:

  1. cgi.force_redirect (implicit 1, INI_SYSTEM): necesară, potrivit manualului, pentru a opera PHP ca CGI în siguranță sub majoritatea serverelor web. Dezactivați doar „pe propriul risc”; sub IIS trebuie să fie oprită.
  2. cgi.fix_pathinfo (implicit 1, INI_SYSTEM): asigură valori corecte pentru PATH_INFO și PATH_TRANSLATED. Scripturile ar trebui să folosească SCRIPT_FILENAME în loc de PATH_TRANSLATED.
  3. cgi.discard_path (implicit 0, INI_SYSTEM): permite depunerea în siguranță a fișierului binar CGI în afara directorului web, fără ca protecția .htaccess să poată fi ocolită.
  4. fastcgi.impersonate (implicit 0, INI_SYSTEM): relevantă doar pentru IIS sub Windows.
  5. user_ini.filename și user_ini.cache_ttl (implicit .user.ini și 300 de secunde): controlează dacă și cât de des citește PHP fișierele .user.ini.

La Nginx face parte din asta o transmitere curată a căii scriptului. Un model de bază ușor de citit, fără garanție pentru orice mediu:

location ~ \.php$ {
    try_files $uri =404;               # transmite lui PHP doar fișierele existente
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Linia try_files $uri =404; împiedică transmiterea către PHP a cererilor pentru căi .php inexistente.

De ce este periculos un acces FastCGI deschis

Manualul PHP avertizează explicit: cine poate deschide o conexiune FastCGI către PHP controlează configurația cererii, de exemplu auto_prepend_file, și poate astfel executa orice cod. Motivul este că serverele web pot trimite setări PHP prin parametri FastCGI precum PHP_VALUE și PHP_ADMIN_VALUE.

De aici rezultă reguli clare:

  • Conectați PHP-FPM sau php-cgi în modul FastCGI doar printr-un socket Unix, dacă serverul web rulează pe aceeași gazdă.
  • La TCP setați listen.allowed_clients și blocați portul în firewall; indicații în articolul Firewall pentru serverul web.
  • Țineți strânse drepturile socket-ului cu listen.owner, listen.group și listen.mode.
Important

Verificați cu ss -lntp | grep -i php dacă un proces PHP ascultă pe o adresă TCP. O legare la 0.0.0.0 sau la o adresă publică este un caz de acțiune urgentă.

CGI, FastCGI și PHP2Shell

PHP2Shell afectează atât php-cgi, cât și PHP-FPM. Pentru amândouă se aplică: actualizare la 8.5.12, 8.4.27, 8.3.36 sau 8.2.35, respectiv la un backport confirmat, apoi oprirea și repornirea tuturor proceselor PHP care rulează. La configurațiile FastCGI cu php-cgi, procesele continuă adesea neobservate, pentru că niciun serviciu propriu nu le administrează. Cum găsiți și înlocuiți această moștenire veche descrie php-cgi: moștenire veche cu risc. În Plesk, variantele se numesc altfel; ajutor oferă Plesk: înțelegerea handlerelor PHP.

Cum ajută PHP SOS concret?

  • Inventarierea handlerelor: Stabilim dacă site-urile dumneavoastră rulează prin CGI, FastCGI cu php-cgi sau PHP-FPM.
  • Închiderea accesurilor: Verificăm socket-urile, porturile și regulile de firewall, pentru ca niciun acces FastCGI să nu fie accesibil din exterior.
  • Patch și curățenie: Actualizăm PHP și oprim toate procesele vechi, inclusiv instanțele php-cgi orfane.
  • Înlocuirea: În cadrul întăririi serverului înlocuim moștenirile CGI cu PHP-FPM cu pool-uri proprii.

Întrebări frecvente

Este FastCGI același lucru cu PHP-FPM?

Nu. FastCGI este un protocol prin care un server web comunică cu un proces de aplicație. PHP-FPM este un program care implementează acest protocol pentru PHP și administrează procesele. Și php-cgi poate vorbi FastCGI, dar nu oferă pool-uri.

De ce este considerat CGI-ul simplu depășit?

La CGI, serverul web pornește un proces nou pentru fiecare cerere, iar PHP își citește de fiecare dată configurația. Aceasta costă timp și resurse. FastCGI și PHP-FPM țin procesele permanent pregătite și sunt de aceea mult mai eficiente.

Ce este un .user.ini?

Un .user.ini este un mic fișier de configurare dintr-un director web. Potrivit manualului PHP, este citit doar de SAPI-urile CGI și FastCGI, deci și de PHP-FPM. Poate conține doar setări cu modurile INI_PERDIR, INI_USER sau INI_ALL.

Cum îmi dau seama dacă pe serverul meu rulează php-cgi?

Căutați cu comenzi de citire precum ps sau pgrep procese numite php-cgi și uitați-vă în configurația serverului web după intrări precum mod_fcgid, Action sau ScriptAlias cu php-cgi. În panourile de hosting, modul de operare se numește adesea CGI sau aplicație FastCGI.

Surse

Contact imediat

Fiecare oră contează. Scrieți-ne acum.

Descrieți pe scurt sistemul, versiunea PHP și ce ați observat. Ne vom face auziți, clarificăm situația și lucrăm la distanță până când incidentul este încheiat și documentat.

Ajutor imediat