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 →

session.upload_progress uitschakelen: juist en blijvend

De remedie tegen CVE-2026-115560 en een van de PHP2Shell-overbruggingsmaatregelen is snel ingesteld. Om te blijven werken moet ze op de juiste plek staan, vergrendeld zijn en na elke update opnieuw worden gecontroleerd.

Stand 6 min. leestijdHardening en configuratie

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:

  1. Herstart alle PHP-services, bijvoorbeeld systemctl restart php8.3-fpm of Apache bij mod_php. Zonder herstart blijft de oude waarde doorlopen.
  2. Plaats een kort controlebestand met een willekeurige naam in de webroot dat alleen de actuele waarde uitvoert.
  3. Roep het bestand eenmaal op via het echte domein en noteer het resultaat.
  4. 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.

Belangrijk

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.

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