Kort gezegd: Stel session.upload_progress.enabled=0 in de php.ini, in de PHP-FPM-pool of in de Apache-serverconfiguratie in, nooit met ini_set() of .user.ini, en herstart daarna alle PHP-workers. Blijvend wordt de maatregel pas als de waarde tegen opnieuw inschakelen is vergrendeld, in elke uitvoeringsmodus en elke geïnstalleerde PHP-versie geldt en na updates wordt nagecontroleerd.
Een kleine instelling met dubbele werking
Zelden heeft één enkele PHP-instelling zoveel aandacht gekregen. Toen php.net op 21 oktober 2026 de patches tegen PHP2Shell publiceerde, stond session.upload_progress.enabled=0 op de lijst met overbruggingsmaatregelen. Twee dagen later volgde de aanwijzing over CVE-2026-115560 en de aanbevolen remedie was dezelfde instelling.
Veel beheerders hebben haar in die dagen snel ingesteld. Of ze overal werkt, is een andere vraag. Typische gaten zijn snel opgesomd: de waarde staat alleen in de CLI-configuratie, een tweede PHP-versie is vergeten, of een hostingpaneel heeft het bestand bij de volgende opslag overschreven. Dit artikel laat zien hoe u de maatregel zo doorvoert dat ze ook over drie maanden nog geldt.
Belangrijk vooraf: uitschakelen vervangt de PHP-update niet. Volgens vakberichten sluit session.upload_progress.enabled=0 alleen niet beide PHP2Shell-kwetsbaarheden. Wat CVE-2026-115560 precies betreft, legt de pagina CVE-2026-115560: aanwijzing over session-upload-progress uit.
Wat de functie doet en wie haar nodig heeft
Session-upload-progress schrijft tijdens een bestandsupload doorlopend de voortgang in de sessie, zodat een applicatie een voortgangsbalk kan tonen. In PHP is de functie standaard ingeschakeld. De PHP-handleiding wijst er zelf op dat daarbij door de afzender geleverde bestands- en veldnamen ongecontroleerd in het sessiegeheugen terechtkomen, en adviseert de functie uit te schakelen als de applicatie haar niet gebruikt.
Of uw applicatie haar gebruikt, ontdekt u met een puur alleen-lezen zoekopdracht in de code:
# Zoekt naar gebruik van de voortgangsfunctie in de applicatiecode
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/
Vindt de zoekopdracht niets, dan kunt u de functie zonder merkbare gevolgen uitschakelen. Zijn er treffers, dan verliest de applicatie alleen de voortgangsweergave, niet de upload. Moderne formulieren meten de voortgang meestal toch in de browser.
session.upload_progress.enabled op de juiste plek instellen
De instelling heeft volgens de PHP-handleiding de modus INI_PERDIR. Dat betekent: ze kan worden ingesteld in de php.ini, in de serverconfiguratie, in .htaccess (alleen mod_php) en in .user.ini (alleen FPM en CGI), maar niet tijdens de uitvoering. php.net sluit .user.ini uitdrukkelijk uit als plek voor de maatregel. De volgende tabel toont de zinvolle plekken per uitvoeringsmodus.
| Uitvoeringsmodus | Aanbevolen plek | Vergrendelt tegen overschrijven? | Daarna herstarten |
|---|---|---|---|
| PHP-FPM | Poolbestand met php_admin_flag |
ja | elke FPM-service |
| PHP-FPM | php.ini van de FPM-SAPI | nee, .user.ini kan overschrijven |
elke FPM-service |
| Apache met mod_php | VirtualHost of serverconfiguratie met php_admin_flag |
ja | Apache volledig |
| php-cgi, LiteSpeed, FrankenPHP | php.ini van de betreffende runtime | afhankelijk van de opbouw controleren | alle processen van de runtime |
| Docker-image | eigen bestand in /usr/local/etc/php/conf.d/ bij het bouwen |
ja, als geen override is toegestaan | container opnieuw aanmaken |
De twee robuuste varianten zien er zo uit:
; PHP-FPM, bijv. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
# Apache met mod_php, in de VirtualHost of server-breed
<IfModule php_module>
php_admin_flag session.upload_progress.enabled off
</IfModule>
Daarnaast loont de vermelding in de php.ini van elke web-SAPI als basiswaarde. Dan geldt de instelling ook voor nieuwe pools die iemand later aanmaakt. Waarom php_admin_flag het verschil maakt, beschrijft het artikel php_admin_value: instellingen tegen overschrijven vergrendelen.
Werking in de webcontext controleren
De opdrachtregel leest vaak een andere php.ini dan de webserver. Een php -i bewijst daarom weinig. Ook php-fpm8.3 -i toont alleen de php.ini-waarden, niet de vermeldingen uit de pools. Betrouwbaar is alleen een opvraging die werkelijk via de pool loopt.
Zo gaat u te werk:
- Herstart alle PHP-services, bijvoorbeeld
systemctl restart php8.3-fpmof Apache bij mod_php. Zonder herstart blijft de oude waarde doorlopen. - Plaats een kort controlebestand met een willekeurige naam in de webroot dat alleen de actuele waarde uitvoert.
- Roep het bestand eenmaal op via het echte domein en noteer het resultaat.
- Verwijder het bestand meteen weer en herhaal de stap voor elke website en elke pool.
<?php
// Controlebestand: slechts kort neerzetten, daarna meteen verwijderen
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";
Verwacht wordt een lege waarde of '0'. Staat er '1', dan werkt uw instelling in deze pool niet. Controleer na een PHP-update bovendien of alle workers zijn herstart, zoals beschreven onder PHP-FPM en alle workers herstarten.
Laat controlebestanden nooit staan. Ze verraden versies en configuratie en zijn een geliefd doelwit van geautomatiseerde scans.
Zodat de instelling blijft
De meeste terugvallen ontstaan niet door aanvallers, maar door het beheer. Een nieuwe pool wordt gekopieerd uit een oud sjabloon, een pakketupdate legt een nieuwe php.ini aan, of iemand stelt in het hostingpaneel de PHP-versie om. Tegen zulke terugvallen helpen vaste gewoonten.
- Alle versies afdekken: op veel servers draaien meerdere PHP-versies parallel. Elke heeft eigen configuratiemappen en heeft de vermelding nodig.
- Sjablonen aanpassen: poolsjablonen, Ansible-rollen, Dockerfiles en paneelsjablonen bevatten de waarde, zodat nieuwe websites haar automatisch erven.
- Paneelinstellingen gebruiken: in hostingpanelen hoort de waarde in de door het paneel voorziene extra directieven, anders overschrijft de volgende wijziging het handwerk.
- Na updates controleren: de controle uit de vorige paragraaf hoort op de checklist van elke PHP-update.
- Documenteren: datum, server, pools en resultaat vastleggen. Dat helpt later richting directie, verzekeraar of controleurs.
Wie .user.ini helemaal niet gebruikt, kan het inlezen van zulke bestanden met user_ini.filename = in de php.ini geheel uitschakelen. Dat treft echter alle instellingen die applicaties daar neerzetten. Test deze stap daarom vooraf, vooral bij CMS'en die eigen .user.ini-bestanden schrijven.
De overige overbruggingsmaatregelen van php.net, zoals de grenzen voor post_max_size en de geheugengrens via cgroup, staan gebundeld onder Noodmaatregelen als u nog niet kunt patchen. Hoe PHP zijn configuratieniveaus in beginsel ordent, legt De php.ini uitgelegd uit.
Hoe helpt PHP SOS concreet?
- Bestand opnemen: wij stellen alle PHP-versies, uitvoeringsmodi en pools op uw servers vast en lezen de werkzame waarden in de webcontext uit.
- Netjes instellen: wij nemen de instelling vergrendeld op in pools en serverconfiguratie en herstarten alle workers gecontroleerd.
- Werking testen: uploadformulieren en mediabeheer controleren wij na de omschakeling.
- Terugval voorkomen: sjablonen, deployments en paneelinstellingen passen wij aan en wij documenteren de stand in het kader van de serverhardening.
Veelgestelde vragen
Waarom werkt session.upload_progress.enabled=0 niet via ini_set()?
De instelling hoort volgens de PHP-handleiding bij de modus INI_PERDIR. Ze kan daarom helemaal niet tijdens de uitvoering met ini_set() worden gewijzigd. php.net noemt als juiste plaatsen de php.ini, de FPM-pool of de serverconfiguratie en sluit .user.ini uitdrukkelijk uit.
Werken bestandsuploads nog na het uitschakelen?
Ja. Uitgeschakeld wordt alleen de voortgangsmelding die PHP tijdens een upload in de sessie schrijft. De upload zelf loopt gewoon door. Getroffen zijn alleen applicaties die hun voortgangsbalk precies via deze PHP-functie bouwen.
Kan een applicatie de functie weer inschakelen?
Via een .htaccess-bestand bij mod_php of een .user.ini bij PHP-FPM is dat in beginsel mogelijk, zolang de waarde niet is vergrendeld. Met php_admin_flag in de pool of in de Apache-configuratie voorkomt u dat.
Moet ik de waarde na de volgende PHP-update terugzetten?
Nee, dat is niet nodig. De functie wordt door de meeste applicaties niet gebruikt en de PHP-handleiding raadt zelf aan haar in zulke gevallen uit te schakelen. Controleer na elke update alleen of de waarde nog geldt.