# session.upload_progress abschalten: richtig und dauerhaft

> session.upload_progress.enabled=0 richtig setzen: wo der Wert greift, wie Sie ihn gegen Wiedereinschalten sperren und im Webkontext sicher nachprüfen.

Quelle: https://phpsos.de/blog/session-upload-progress-abschalten/  
Stand: 25.10.2026  
Anbieter: PHP SOS, PHP-Notfallhilfe und Server-Sicherheit. Soforthilfe per WhatsApp: https://wa.me/491736494914?text=Hallo%20PHP%20SOS%2C%20wir%20brauchen%20Hilfe%20mit%20unserem%20PHP-Server.%20Firma%3A%20%E2%80%A6%20Website%3A%20%E2%80%A6

**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](https://phpsos.de/php2shell/cve-2026-115560/).

## 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:

```bash
# 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:

```ini
; PHP-FPM, z. B. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
```

```apache
# 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](https://phpsos.de/blog/php-admin-value-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:

1. Alle PHP-Dienste neu starten, zum Beispiel `systemctl restart php8.3-fpm` oder Apache bei mod_php. Ohne Neustart läuft der alte Wert weiter.
2. Eine kurze Prüfdatei mit zufälligem Namen in den Webroot legen, die nur den aktuellen Wert ausgibt.
3. Die Datei einmal über die echte Domain aufrufen und das Ergebnis notieren.
4. Die Datei sofort wieder löschen und den Schritt für jede Website und jeden Pool wiederholen.

```php
<?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](https://phpsos.de/php2shell/php-fpm-neustart/) beschrieben.

> **Wichtig:**
> 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](https://phpsos.de/php2shell/sofortmassnahmen-ohne-patch/). Wie PHP seine Konfigurationsebenen grundsätzlich ordnet, erklärt [Die php.ini erklärt](https://phpsos.de/php/php-ini-erklaert/).

## 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](https://phpsos.de/leistungen/server-haertung/).


## 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.

## Quellen

- [php.net: Sicherheitsmeldungen](https://www.php.net/)
- [PHP-Handbuch: Session-Konfiguration](https://www.php.net/manual/en/session.configuration.php)
- [PHP-Handbuch: .user.ini-Dateien](https://www.php.net/manual/en/configuration.file.per-user.php)
