Kurz gesagt: CGI (Common Gateway Interface) ist eine alte Schnittstelle, bei der der Webserver für jede Anfrage ein neues Programm startet, bei PHP das Programm php-cgi. FastCGI ist die Weiterentwicklung: PHP-Prozesse laufen dauerhaft und nehmen viele Anfragen über einen Socket entgegen. PHP-FPM ist die wichtigste FastCGI-Umsetzung für PHP. Sicherheitsrelevant sind vor allem die cgi.*-Einstellungen und die Regel, dass ein FastCGI-Zugang nie öffentlich erreichbar sein darf.
Was ist CGI?
CGI ist eine der ältesten Methoden, mit der Webserver dynamische Inhalte erzeugen. Das PHP-Handbuch verweist bei der Einstellung cgi.rfc2616_headers auf RFC 3875, die Spezifikation des Common Gateway Interface. Auch die Anfänge von PHP waren CGI-Programme: Rasmus Lerdorf schrieb 1994 die ersten „Personal Home Page Tools“ als CGI-Binärdateien in C.
Das Prinzip: Für jede Anfrage startet der Webserver einen neuen Prozess, übergibt Anfragedaten über Umgebungsvariablen und die Standardeingabe und liest die Antwort aus der Standardausgabe. Danach endet der Prozess. Laut PHP-Handbuch liest PHP bei CGI und CLI seine php.ini bei jedem Aufruf neu, bei Servermodulen nur beim Start.
Das macht CGI robust, weil jede Anfrage mit einem frischen Prozess beginnt. Es macht CGI aber auch langsam: Prozessstart, Konfiguration laden und Erweiterungen initialisieren kosten bei jeder Anfrage Zeit.
Was ist FastCGI?
FastCGI löst das Leistungsproblem, indem Prozesse am Leben bleiben. Der Webserver verbindet sich über einen Unix-Socket oder einen TCP-Port mit einem laufenden Prozess und schickt ihm die Anfrage im FastCGI-Protokoll. Der Prozess bearbeitet sie und wartet auf die nächste.
| Merkmal | CGI | FastCGI mit php-cgi | FastCGI mit PHP-FPM |
|---|---|---|---|
| Prozess je Anfrage | ja | nein | nein |
| SAPI-Name | cgi-fcgi |
cgi-fcgi |
fpm-fcgi |
| Pools mit eigenem Benutzer | nein | nein | ja |
| Prozesssteuerung | Webserver | Webserver-Modul, z. B. mod_fcgid | eigener Master-Prozess |
.user.ini wird gelesen |
ja | ja | ja |
PHP-FPM ist laut Handbuch die primäre FastCGI-Implementierung von PHP. Es ergänzt das Protokoll um Prozessverwaltung, Pools, Statusseiten und ein Slowlog. Die Einzelheiten stehen unter PHP-FPM erklärt.
Die cgi-Einstellungen in der php.ini
Für CGI-Betrieb kennt PHP eigene Einstellungen. Die folgenden Werte und Beschreibungen stammen aus dem PHP-Handbuch:
cgi.force_redirect(Standard 1,INI_SYSTEM): laut Handbuch nötig, um PHP als CGI unter den meisten Webservern sicher zu betreiben. Abschalten nur „auf eigenes Risiko“; unter IIS muss es aus sein.cgi.fix_pathinfo(Standard 1,INI_SYSTEM): sorgt für korrektePATH_INFO- undPATH_TRANSLATED-Werte. Skripte sollenSCRIPT_FILENAMEstattPATH_TRANSLATEDnutzen.cgi.discard_path(Standard 0,INI_SYSTEM): erlaubt, die CGI-Binärdatei sicher ausserhalb des Webverzeichnisses abzulegen, ohne dass.htaccess-Schutz umgangen werden kann.fastcgi.impersonate(Standard 0,INI_SYSTEM): nur für IIS unter Windows relevant.user_ini.filenameunduser_ini.cache_ttl(Standard.user.iniund 300 Sekunden): steuern, ob und wie oft PHP.user.ini-Dateien liest.
Bei Nginx gehört dazu eine saubere Übergabe des Skriptpfads. Ein lesbares Grundmuster, ohne Gewähr für jede Umgebung:
location ~ \.php$ {
try_files $uri =404; # nur existierende Dateien an PHP geben
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Die Zeile try_files $uri =404; verhindert, dass Anfragen auf nicht existierende .php-Pfade an PHP weitergereicht werden.
Warum ein offener FastCGI-Zugang gefährlich ist
Das PHP-Handbuch warnt ausdrücklich: Wer eine FastCGI-Verbindung zu PHP öffnen kann, kontrolliert die Konfiguration der Anfrage, etwa auto_prepend_file, und kann damit beliebigen Code ausführen. Grund ist, dass Webserver PHP-Einstellungen über FastCGI-Parameter wie PHP_VALUE und PHP_ADMIN_VALUE mitschicken dürfen.
Daraus folgen klare Regeln:
- PHP-FPM oder php-cgi im FastCGI-Modus nur über einen Unix-Socket anbinden, wenn der Webserver auf demselben Host läuft.
- Bei TCP
listen.allowed_clientssetzen und den Port in der Firewall sperren; Hinweise dazu im Beitrag Firewall für Webserver. - Socket-Rechte mit
listen.owner,listen.groupundlisten.modeeng halten.
Prüfen Sie mit ss -lntp | grep -i php, ob ein PHP-Prozess auf einer TCP-Adresse lauscht. Eine Bindung an 0.0.0.0 oder eine öffentliche Adresse ist ein dringender Handlungsfall.
CGI, FastCGI und PHP2Shell
Von PHP2Shell sind sowohl php-cgi als auch PHP-FPM betroffen. Für beide gilt: Update auf 8.5.12, 8.4.27, 8.3.36 oder 8.2.35 bzw. einen bestätigten Backport, dann alle laufenden PHP-Prozesse beenden und neu starten. Bei FastCGI-Setups mit php-cgi laufen Prozesse oft unbemerkt weiter, weil kein eigener Dienst sie verwaltet. Wie Sie diese Altlast finden und ablösen, steht unter php-cgi: Altlast mit Risiko. In Plesk heissen die Varianten anders; Hilfe gibt Plesk: PHP-Handler verstehen.
Wie hilft PHP SOS konkret?
- Handler erfassen: Wir ermitteln, ob Ihre Websites über CGI, FastCGI mit php-cgi oder PHP-FPM laufen.
- Zugänge schliessen: Wir prüfen Sockets, Ports und Firewall-Regeln, damit kein FastCGI-Zugang von aussen erreichbar ist.
- Patchen und aufräumen: Wir aktualisieren PHP und beenden alle alten Prozesse, auch verwaiste php-cgi-Instanzen.
- Ablösen: Im Rahmen der Server-Härtung ersetzen wir CGI-Altlasten durch PHP-FPM mit eigenen Pools.
Häufige Fragen
Ist FastCGI dasselbe wie PHP-FPM?
Nein. FastCGI ist ein Protokoll, über das ein Webserver mit einem Anwendungsprozess spricht. PHP-FPM ist ein Programm, das dieses Protokoll für PHP umsetzt und die Prozesse verwaltet. Auch php-cgi kann FastCGI sprechen, bietet aber keine Pools.
Warum gilt reines CGI als veraltet?
Bei CGI startet der Webserver für jede Anfrage einen neuen Prozess, und PHP liest dabei jedes Mal seine Konfiguration. Das kostet Zeit und Ressourcen. FastCGI und PHP-FPM halten Prozesse dauerhaft bereit und sind deshalb deutlich effizienter.
Was ist eine .user.ini?
Eine .user.ini ist eine kleine Konfigurationsdatei in einem Webverzeichnis. Laut PHP-Handbuch wird sie nur von den CGI- und FastCGI-SAPIs gelesen, also auch von PHP-FPM. Sie darf nur Einstellungen mit den Modi INI_PERDIR, INI_USER oder INI_ALL enthalten.
Wie erkenne ich, ob auf meinem Server php-cgi läuft?
Mit lesenden Befehlen wie ps oder pgrep nach Prozessen namens php-cgi suchen und in der Webserver-Konfiguration nach Einträgen wie mod_fcgid, Action oder ScriptAlias mit php-cgi schauen. In Hosting-Panels heisst die Betriebsart oft CGI oder FastCGI-Anwendung.