Kurz gesagt: Setzen Sie session.upload_progress.enabled=0 in der php.ini, im PHP-FPM-Pool oder in der Apache-Serverkonfiguration, nie per ini_set() oder .user.ini, und starten Sie danach alle PHP-Worker neu. Dauerhaft wird die Maßnahme erst, wenn der Wert gegen Wiedereinschalten gesperrt ist, in jeder Betriebsart und jeder installierten PHP-Version gilt und nach Updates nachgeprüft wird.
Eine kleine Einstellung mit doppelter Wirkung
Selten hat eine einzelne PHP-Einstellung so viel Aufmerksamkeit bekommen. Als php.net am 21. Oktober 2026 die Patches gegen PHP2Shell veröffentlichte, stand session.upload_progress.enabled=0 auf der Liste der Übergangsmaßnahmen. Zwei Tage später folgte der Hinweis zu CVE-2026-115560, und die empfohlene Abhilfe war dieselbe Einstellung.
Viele Administratoren haben sie in diesen Tagen schnell gesetzt. Ob sie überall wirkt, ist eine andere Frage. Typische Lücken sind schnell aufgezählt: Der Wert steht nur in der CLI-Konfiguration, eine zweite PHP-Version wurde vergessen, oder ein Hosting-Panel hat die Datei beim nächsten Speichern überschrieben. Dieser Beitrag zeigt, wie Sie die Maßnahme so umsetzen, dass sie auch in drei Monaten noch gilt.
Wichtig vorab: Das Abschalten ersetzt nicht das PHP-Update. Laut Fachberichten schließt session.upload_progress.enabled=0 allein nicht beide PHP2Shell-Lücken. Was CVE-2026-115560 genau betrifft, erklärt die Seite CVE-2026-115560: Session-Upload-Progress-Hinweis.
Was die Funktion macht und wer sie braucht
Session-Upload-Progress schreibt während eines Datei-Uploads laufend den Fortschritt in die Session, damit eine Anwendung einen Fortschrittsbalken anzeigen kann. In PHP ist die Funktion standardmäßig eingeschaltet. Das PHP-Handbuch weist selbst darauf hin, dass dabei vom Absender gelieferte Datei- und Feldnamen ungeprüft im Session-Speicher landen, und empfiehlt, die Funktion abzuschalten, wenn die Anwendung sie nicht nutzt.
Ob Ihre Anwendung sie nutzt, finden Sie mit einer rein lesenden Suche im Code heraus:
# Sucht nach Verwendungen der Fortschrittsfunktion im Anwendungscode
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/
Findet die Suche nichts, können Sie die Funktion ohne spürbare Folgen abschalten. Gibt es Treffer, verliert die Anwendung nur die Fortschrittsanzeige, nicht den Upload. Moderne Formulare messen den Fortschritt meist ohnehin im Browser.
session.upload_progress.enabled an der richtigen Stelle setzen
Die Einstellung hat laut PHP-Handbuch den Modus INI_PERDIR. Das bedeutet: Sie lässt sich in der php.ini, in der Serverkonfiguration, in .htaccess (nur mod_php) und in .user.ini (nur FPM und CGI) setzen, aber nicht zur Laufzeit. php.net schließt .user.ini als Ort für die Maßnahme ausdrücklich aus. Die folgende Tabelle zeigt die sinnvollen Orte je Betriebsart.
| Betriebsart | Empfohlener Ort | Sperrt gegen Überschreiben? | Danach neu starten |
|---|---|---|---|
| PHP-FPM | Pool-Datei mit php_admin_flag |
ja | jeden FPM-Dienst |
| PHP-FPM | php.ini der FPM-SAPI | nein, .user.ini könnte überschreiben |
jeden FPM-Dienst |
| Apache mit mod_php | VirtualHost oder Serverkonfiguration mit php_admin_flag |
ja | Apache vollständig |
| php-cgi, LiteSpeed, FrankenPHP | php.ini der jeweiligen Laufzeit | je nach Aufbau prüfen | alle Prozesse der Laufzeit |
| Docker-Image | eigene Datei in /usr/local/etc/php/conf.d/ beim Bau |
ja, wenn kein Override erlaubt | Container neu erstellen |
Die beiden robusten Varianten sehen so aus:
; PHP-FPM, z. B. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
# Apache mit mod_php, im VirtualHost oder serverweit
<IfModule php_module>
php_admin_flag session.upload_progress.enabled off
</IfModule>
Zusätzlich lohnt der Eintrag in der php.ini jeder Web-SAPI als Grundwert. Dann gilt die Einstellung auch für neue Pools, die später jemand anlegt. Warum php_admin_flag den Unterschied macht, beschreibt der Beitrag php_admin_value: Einstellungen gegen Überschreiben sperren.
Wirksamkeit im Webkontext prüfen
Die Kommandozeile liest oft eine andere php.ini als der Webserver. Ein php -i beweist deshalb wenig. Auch php-fpm8.3 -i zeigt nur die php.ini-Werte, nicht die Einträge aus den Pools. Verlässlich ist nur eine Abfrage, die tatsächlich über den Pool läuft.
So gehen Sie vor:
- Alle PHP-Dienste neu starten, zum Beispiel
systemctl restart php8.3-fpmoder Apache bei mod_php. Ohne Neustart läuft der alte Wert weiter. - Eine kurze Prüfdatei mit zufälligem Namen in den Webroot legen, die nur den aktuellen Wert ausgibt.
- Die Datei einmal über die echte Domain aufrufen und das Ergebnis notieren.
- Die Datei sofort wieder löschen und den Schritt für jede Website und jeden Pool wiederholen.
<?php
// Prüfdatei: nur kurz ablegen, danach sofort löschen
header('Content-Type: text/plain');
echo 'session.upload_progress.enabled = ', var_export(ini_get('session.upload_progress.enabled'), true), "\n";
echo 'PHP ', PHP_VERSION, ' / SAPI ', PHP_SAPI, "\n";
Erwartet wird ein leerer Wert oder '0'. Steht dort '1', greift Ihre Einstellung in diesem Pool nicht. Nach einem PHP-Update prüfen Sie zusätzlich, ob alle Worker neu gestartet sind, wie unter PHP-FPM und alle Worker neu starten beschrieben.
Lassen Sie Prüfdateien nie liegen. Sie verraten Versionen und Konfiguration und sind ein beliebtes Ziel automatisierter Scans.
Damit die Einstellung dauerhaft bleibt
Die meisten Rückfälle entstehen nicht durch Angreifer, sondern durch den Betrieb. Ein neuer Pool wird aus einer alten Vorlage kopiert, ein Paket-Update legt eine neue php.ini an, oder jemand stellt im Hosting-Panel die PHP-Version um. Gegen solche Rückfälle helfen feste Gewohnheiten.
- Alle Versionen abdecken: Auf vielen Servern laufen mehrere PHP-Versionen parallel. Jede hat eigene Konfigurationsordner und braucht den Eintrag.
- Vorlagen anpassen: Pool-Vorlagen, Ansible-Rollen, Dockerfiles und Panel-Vorlagen enthalten den Wert, damit neue Websites ihn automatisch erben.
- Panel-Einstellungen nutzen: In Hosting-Panels gehört der Wert in die vom Panel vorgesehenen Zusatzdirektiven, sonst überschreibt die nächste Änderung die Handarbeit.
- Nach Updates prüfen: Die Prüfung aus dem vorigen Abschnitt gehört in die Checkliste jedes PHP-Updates.
- Dokumentieren: Datum, Server, Pools und Ergebnis festhalten. Das hilft später gegenüber Geschäftsführung, Versicherer oder Prüfern.
Wer .user.ini überhaupt nicht nutzt, kann das Einlesen solcher Dateien mit user_ini.filename = in der php.ini ganz abschalten. Das betrifft aber alle Einstellungen, die Anwendungen dort ablegen. Testen Sie diesen Schritt deshalb vorher, besonders bei CMS, die eigene .user.ini-Dateien schreiben.
Die übrigen Übergangsmaßnahmen von php.net, etwa die Grenzen für post_max_size und die Speichergrenze per cgroup, stehen gesammelt unter Sofortmaßnahmen, wenn Sie noch nicht patchen können. Wie PHP seine Konfigurationsebenen grundsätzlich ordnet, erklärt Die php.ini erklärt.
Wie hilft PHP SOS konkret?
- Bestand aufnehmen: Wir ermitteln alle PHP-Versionen, Betriebsarten und Pools auf Ihren Servern und lesen die wirksamen Werte im Webkontext aus.
- Sauber setzen: Wir tragen die Einstellung gesperrt in Pools und Serverkonfiguration ein und starten alle Worker kontrolliert neu.
- Funktion testen: Upload-Formulare und Medienverwaltung prüfen wir nach der Umstellung.
- Rückfälle verhindern: Vorlagen, Deployments und Panel-Einstellungen passen wir an und dokumentieren den Stand im Rahmen der Server-Härtung.
Häufige Fragen
Warum wirkt session.upload_progress.enabled=0 nicht über ini_set()?
Die Einstellung gehört laut PHP-Handbuch zum Modus INI_PERDIR. Sie kann deshalb gar nicht zur Laufzeit per ini_set() geändert werden. php.net nennt als richtige Orte die php.ini, den FPM-Pool oder die Serverkonfiguration und schließt .user.ini ausdrücklich aus.
Funktionieren Datei-Uploads nach dem Abschalten noch?
Ja. Abgeschaltet wird nur die Fortschrittsmeldung, die PHP während eines Uploads in die Session schreibt. Der Upload selbst läuft weiter. Betroffen sind nur Anwendungen, die ihren Fortschrittsbalken genau über diese PHP-Funktion bauen.
Kann eine Anwendung die Funktion wieder einschalten?
Über eine .htaccess-Datei bei mod_php oder eine .user.ini bei PHP-FPM ist das grundsätzlich möglich, solange der Wert nicht gesperrt ist. Mit php_admin_flag im Pool oder in der Apache-Konfiguration verhindern Sie das.
Muss ich den Wert nach dem nächsten PHP-Update wieder zurücksetzen?
Nein, das ist nicht nötig. Die Funktion wird von den meisten Anwendungen nicht gebraucht, und das PHP-Handbuch rät selbst dazu, sie in solchen Fällen abzuschalten. Prüfen Sie nach jedem Update nur, ob der Wert noch gilt.