Actuele situatie: PHP2Shell. Twee kritieke PHP-kwetsbaarheden (CVSS 9.2) maken schadelijke code zonder inloggen mogelijk. Patches sinds 21-10-2026.Wat u nu moet doen →

CGI en FastCGI: de basis

CGI start voor elk verzoek een proces, FastCGI houdt processen in leven. Wat dat voor PHP, php-cgi en PHP-FPM betekent en welke instellingen de beveiliging raken.

Stand 4 min. leestijdPHP-kennis

Kort gezegd: CGI (Common Gateway Interface) is een oude interface waarbij de webserver voor elk verzoek een nieuw programma start, bij PHP het programma php-cgi. FastCGI is de doorontwikkeling: PHP-processen draaien permanent en nemen veel verzoeken via een socket aan. PHP-FPM is de belangrijkste FastCGI-implementatie voor PHP. Voor de beveiliging zijn vooral de cgi.*-instellingen van belang en de regel dat een FastCGI-toegang nooit openbaar bereikbaar mag zijn.

Wat is CGI?

CGI is een van de oudste methoden waarmee webservers dynamische inhoud maken. De PHP-handleiding verwijst bij de instelling cgi.rfc2616_headers naar RFC 3875, de specificatie van de Common Gateway Interface. Ook de beginjaren van PHP waren CGI-programma's: Rasmus Lerdorf schreef in 1994 de eerste „Personal Home Page Tools” als CGI-binaries in C.

Het principe: voor elk verzoek start de webserver een nieuw proces, geeft verzoekgegevens door via omgevingsvariabelen en de standaardinvoer en leest het antwoord uit de standaarduitvoer. Daarna eindigt het proces. Volgens de PHP-handleiding leest PHP bij CGI en CLI zijn php.ini bij elke aanroep opnieuw, bij servermodules alleen bij het starten.

Dat maakt CGI robuust, omdat elk verzoek met een vers proces begint. Het maakt CGI echter ook traag: processtart, configuratie laden en extensies initialiseren kosten bij elk verzoek tijd.

Wat is FastCGI?

FastCGI lost het prestatieprobleem op doordat processen in leven blijven. De webserver verbindt via een Unix-socket of een TCP-poort met een lopend proces en stuurt het verzoek in het FastCGI-protocol. Het proces handelt het af en wacht op het volgende.

Kenmerk CGI FastCGI met php-cgi FastCGI met PHP-FPM
Proces per verzoek ja nee nee
SAPI-naam cgi-fcgi cgi-fcgi fpm-fcgi
Pools met eigen gebruiker nee nee ja
Processturing webserver webservermodule, bijv. mod_fcgid eigen masterproces
.user.ini wordt gelezen ja ja ja

PHP-FPM is volgens de handleiding de primaire FastCGI-implementatie van PHP. Het vult het protocol aan met procesbeheer, pools, statuspagina's en een slowlog. De details staan onder PHP-FPM uitgelegd.

De cgi-instellingen in de php.ini

Voor CGI-gebruik kent PHP eigen instellingen. De volgende waarden en beschrijvingen komen uit de PHP-handleiding:

  1. cgi.force_redirect (standaard 1, INI_SYSTEM): volgens de handleiding nodig om PHP als CGI onder de meeste webservers veilig te draaien. Uitschakelen alleen „op eigen risico”; onder IIS moet het uit.
  2. cgi.fix_pathinfo (standaard 1, INI_SYSTEM): zorgt voor correcte PATH_INFO- en PATH_TRANSLATED-waarden. Scripts moeten SCRIPT_FILENAME gebruiken in plaats van PATH_TRANSLATED.
  3. cgi.discard_path (standaard 0, INI_SYSTEM): maakt het mogelijk de CGI-binary veilig buiten de webmap te plaatsen, zonder dat de .htaccess-bescherming kan worden omzeild.
  4. fastcgi.impersonate (standaard 0, INI_SYSTEM): alleen relevant voor IIS onder Windows.
  5. user_ini.filename en user_ini.cache_ttl (standaard .user.ini en 300 seconden): bepalen of en hoe vaak PHP .user.ini-bestanden leest.

Bij Nginx hoort daar een nette doorgifte van het scriptpad bij. Een leesbaar basispatroon, zonder garantie voor elke omgeving:

location ~ \.php$ {
    try_files $uri =404;               # alleen bestaande bestanden aan PHP geven
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

De regel try_files $uri =404; voorkomt dat verzoeken naar niet-bestaande .php-paden aan PHP worden doorgegeven.

Waarom een open FastCGI-toegang gevaarlijk is

De PHP-handleiding waarschuwt uitdrukkelijk: wie een FastCGI-verbinding met PHP kan openen, beheerst de configuratie van het verzoek, bijvoorbeeld auto_prepend_file, en kan daarmee willekeurige code uitvoeren. De reden is dat webservers PHP-instellingen via FastCGI-parameters als PHP_VALUE en PHP_ADMIN_VALUE mogen meesturen.

Hieruit volgen duidelijke regels:

  • PHP-FPM of php-cgi in FastCGI-modus alleen via een Unix-socket aansluiten als de webserver op dezelfde host draait.
  • Bij TCP listen.allowed_clients instellen en de poort in de firewall blokkeren; aanwijzingen daarvoor in het artikel Firewall voor webservers.
  • Socketrechten met listen.owner, listen.group en listen.mode krap houden.
Belangrijk

Controleer met ss -lntp | grep -i php of een PHP-proces op een TCP-adres luistert. Een binding aan 0.0.0.0 of een openbaar adres is een dringend geval voor actie.

CGI, FastCGI en PHP2Shell

Door PHP2Shell zijn zowel php-cgi als PHP-FPM getroffen. Voor beide geldt: update naar 8.5.12, 8.4.27, 8.3.36 of 8.2.35, dan wel een bevestigde backport, en daarna alle lopende PHP-processen beëindigen en opnieuw starten. Bij FastCGI-opstellingen met php-cgi blijven processen vaak onopgemerkt doordraaien, omdat geen eigen dienst ze beheert. Hoe u deze erfenis vindt en vervangt, staat onder php-cgi: erfenis met risico. In Plesk heten de varianten anders; hulp biedt Plesk: PHP-handlers begrijpen.

Hoe helpt PHP SOS concreet?

  • Handlers in kaart brengen: Wij stellen vast of uw websites via CGI, FastCGI met php-cgi of PHP-FPM draaien.
  • Toegangen sluiten: Wij controleren sockets, poorten en firewallregels, zodat geen FastCGI-toegang van buitenaf bereikbaar is.
  • Patchen en opruimen: Wij werken PHP bij en beëindigen alle oude processen, ook verweesde php-cgi-instanties.
  • Vervangen: In het kader van de serverhardening vervangen wij CGI-erfenissen door PHP-FPM met eigen pools.

Veelgestelde vragen

Is FastCGI hetzelfde als PHP-FPM?

Nee. FastCGI is een protocol waarmee een webserver met een toepassingsproces praat. PHP-FPM is een programma dat dit protocol voor PHP implementeert en de processen beheert. Ook php-cgi kan FastCGI spreken, maar biedt geen pools.

Waarom geldt puur CGI als verouderd?

Bij CGI start de webserver voor elk verzoek een nieuw proces, en PHP leest daarbij telkens zijn configuratie. Dat kost tijd en resources. FastCGI en PHP-FPM houden processen permanent klaar en zijn daarom duidelijk efficiënter.

Wat is een .user.ini?

Een .user.ini is een klein configuratiebestand in een webmap. Volgens de PHP-handleiding wordt het alleen door de CGI- en FastCGI-SAPI's gelezen, dus ook door PHP-FPM. Het mag alleen instellingen met de modi INI_PERDIR, INI_USER of INI_ALL bevatten.

Hoe herken ik of op mijn server php-cgi draait?

Zoek met lezende opdrachten als ps of pgrep naar processen met de naam php-cgi en kijk in de webserverconfiguratie naar vermeldingen als mod_fcgid, Action of ScriptAlias met php-cgi. In hostingpanelen heet de uitvoeringsmodus vaak CGI of FastCGI-toepassing.

Bronnen

Direct contact

Elk uur telt. Schrijf ons nu.

Beschrijf kort het systeem, de PHP-versie en wat u opmerkt. Wij nemen contact op, brengen de situatie in kaart en werken op afstand tot het incident is afgerond en gedocumenteerd.

Directe hulp