Situația actuală: PHP2Shell. Două vulnerabilități critice PHP (CVSS 9.2) permit cod malițios fără autentificare. Patchuri din 21.10.2026.Ce este de făcut acum →

Dezactivarea session.upload_progress: corect și durabil

Remediul pentru CVE-2026-115560 și una dintre măsurile provizorii PHP2Shell se stabilește repede. Ca să reziste, trebuie să fie la locul potrivit, blocat și reverificat după fiecare actualizare.

Stadiu 6 min de cititSecurizare și configurare

Pe scurt: Stabiliți session.upload_progress.enabled=0 în php.ini, în pool-ul PHP-FPM sau în configurația serverului Apache, niciodată prin ini_set() sau .user.ini, și reporniți apoi toți workerii PHP. Măsura devine durabilă abia când valoarea este blocată împotriva reactivării, se aplică în fiecare mod de operare și în fiecare versiune PHP instalată și este reverificată după actualizări.

O setare mică, cu efect dublu

Rar o singură setare PHP a primit atâta atenție. Când php.net a publicat, la 21 octombrie 2026, patchurile împotriva PHP2Shell, session.upload_progress.enabled=0 se afla pe lista măsurilor provizorii. Două zile mai târziu a urmat indicația privind CVE-2026-115560, iar remediul recomandat era aceeași setare.

Mulți administratori au stabilit-o repede în aceste zile. Dacă acționează peste tot este o altă întrebare. Lacunele tipice se enumeră repede: valoarea se află doar în configurația CLI, o a doua versiune PHP a fost uitată sau un panou de hosting a suprascris fișierul la următoarea salvare. Acest articol arată cum aplicați măsura astfel încât să se mai aplice și peste trei luni.

Important în prealabil: dezactivarea nu înlocuiește actualizarea PHP. Potrivit rapoartelor de specialitate, session.upload_progress.enabled=0 singură nu închide ambele vulnerabilități PHP2Shell. Ce anume privește CVE-2026-115560 explică pagina CVE-2026-115560: indicația privind Session-Upload-Progress.

Ce face funcția și cine are nevoie de ea

Session-Upload-Progress scrie continuu, în timpul unei încărcări de fișier, progresul în sesiune, pentru ca o aplicație să poată afișa o bară de progres. În PHP, funcția este activată implicit. Manualul PHP atrage el însuși atenția că numele de fișiere și de câmpuri furnizate de expeditor ajung astfel neverificate în stocarea sesiunii și recomandă dezactivarea funcției dacă aplicația nu o folosește.

Dacă aplicația dumneavoastră o folosește aflați cu o căutare exclusiv de citire în cod:

# Caută utilizări ale funcției de progres în codul aplicației
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/

Dacă căutarea nu găsește nimic, puteți dezactiva funcția fără consecințe vizibile. Dacă există rezultate, aplicația pierde doar afișarea progresului, nu încărcarea. Formularele moderne măsoară oricum de obicei progresul în browser.

Stabilirea session.upload_progress.enabled la locul potrivit

Potrivit manualului PHP, setarea are modul INI_PERDIR. Aceasta înseamnă: poate fi stabilită în php.ini, în configurația serverului, în .htaccess (doar mod_php) și în .user.ini (doar FPM și CGI), dar nu în timpul execuției. php.net exclude explicit .user.ini ca loc pentru măsură. Tabelul următor arată locurile potrivite pentru fiecare mod de operare.

Mod de operare Loc recomandat Blochează împotriva suprascrierii? Apoi reporniți
PHP-FPM fișierul pool-ului, cu php_admin_flag da fiecare serviciu FPM
PHP-FPM php.ini al SAPI FPM nu, .user.ini ar putea suprascrie fiecare serviciu FPM
Apache cu mod_php VirtualHost sau configurația serverului, cu php_admin_flag da Apache complet
php-cgi, LiteSpeed, FrankenPHP php.ini al mediului de execuție respectiv verificați în funcție de construcție toate procesele mediului de execuție
Imagine Docker fișier propriu în /usr/local/etc/php/conf.d/ la construire da, dacă nu este permisă suprascrierea recreați containerul

Cele două variante robuste arată astfel:

; PHP-FPM, de ex. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
# Apache cu mod_php, în VirtualHost sau la nivel de server
<IfModule php_module>
    php_admin_flag session.upload_progress.enabled off
</IfModule>

Suplimentar, merită intrarea în php.ini al fiecărui SAPI web, ca valoare de bază. Atunci setarea se aplică și pool-urilor noi pe care le creează cineva mai târziu. De ce php_admin_flag face diferența descrie articolul php_admin_value: blocarea setărilor împotriva suprascrierii.

Verificarea eficacității în contextul web

Linia de comandă citește adesea un alt php.ini decât serverul web. Un php -i dovedește de aceea puțin. Nici php-fpm8.3 -i nu arată decât valorile din php.ini, nu intrările din pool-uri. Fiabilă este doar o interogare care rulează efectiv prin pool.

Procedați astfel:

  1. Reporniți toate serviciile PHP, de exemplu systemctl restart php8.3-fpm sau Apache la mod_php. Fără repornire, continuă să ruleze valoarea veche.
  2. Depuneți în webroot un scurt fișier de verificare, cu nume aleatoriu, care afișează doar valoarea curentă.
  3. Apelați fișierul o dată prin domeniul real și notați rezultatul.
  4. Ștergeți imediat fișierul și repetați pasul pentru fiecare site și fiecare pool.
<?php
// Fișier de verificare: depuneți-l doar pe scurt, apoi ștergeți-l imediat
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";

Se așteaptă o valoare goală sau '0'. Dacă apare '1', setarea dumneavoastră nu se aplică în acest pool. După o actualizare PHP verificați suplimentar dacă toți workerii au fost reporniți, așa cum este descris la Repornirea PHP-FPM și a tuturor workerilor.

Important

Nu lăsați niciodată fișiere de verificare pe loc. Ele dezvăluie versiuni și configurație și sunt o țintă preferată a scanărilor automate.

Pentru ca setarea să rămână durabilă

Majoritatea revenirilor la starea veche nu provin de la atacatori, ci din operare. Un pool nou este copiat dintr-un șablon vechi, o actualizare de pachet creează un php.ini nou sau cineva schimbă versiunea PHP în panoul de hosting. Împotriva unor astfel de reveniri ajută obiceiurile fixe.

  • Acoperiți toate versiunile: Pe multe servere rulează în paralel mai multe versiuni PHP. Fiecare are dosare de configurare proprii și are nevoie de intrare.
  • Adaptați șabloanele: Șabloanele de pool, rolurile Ansible, Dockerfile-urile și șabloanele din panou conțin valoarea, pentru ca site-urile noi să o moștenească automat.
  • Folosiți setările panoului: În panourile de hosting, valoarea aparține directivelor suplimentare prevăzute de panou, altfel următoarea modificare suprascrie munca manuală.
  • Verificați după actualizări: Verificarea din secțiunea anterioară face parte din lista de control a fiecărei actualizări PHP.
  • Documentați: Consemnați data, serverul, pool-urile și rezultatul. Aceasta ajută ulterior față de conducere, asigurător sau auditori.

Cine nu folosește deloc .user.ini poate dezactiva complet citirea unor astfel de fișiere cu user_ini.filename = în php.ini. Aceasta privește însă toate setările pe care aplicațiile le depun acolo. Testați de aceea acest pas în prealabil, în special la CMS-urile care scriu fișiere .user.ini proprii.

Celelalte măsuri provizorii de la php.net, de exemplu limitele pentru post_max_size și limita de memorie prin cgroup, sunt adunate la Măsuri imediate dacă nu puteți încă aplica patchul. Cum își ordonează PHP, în principiu, nivelurile de configurare explică php.ini explicat.

Cum ajută PHP SOS concret?

  • Inventarierea stării existente: Stabilim toate versiunile PHP, modurile de operare și pool-urile de pe serverele dumneavoastră și citim valorile efective în contextul web.
  • Setare corectă: Introducem setarea, blocată, în pool-uri și în configurația serverului și repornim controlat toți workerii.
  • Testarea funcționării: Verificăm formularele de upload și gestionarea media după trecere.
  • Prevenirea reveniri: Adaptăm șabloanele, deploymenturile și setările panoului și documentăm starea în cadrul securizării serverului.

Întrebări frecvente

De ce nu are efect session.upload_progress.enabled=0 prin ini_set()?

Potrivit manualului PHP, setarea face parte din modul INI_PERDIR. De aceea nu poate fi modificată deloc în timpul execuției prin ini_set(). php.net indică drept locuri corecte php.ini, pool-ul FPM sau configurația serverului și exclude explicit .user.ini.

Mai funcționează încărcările de fișiere după dezactivare?

Da. Se dezactivează doar raportarea progresului, pe care PHP o scrie în sesiune în timpul unei încărcări. Încărcarea propriu-zisă continuă. Sunt afectate doar aplicațiile care își construiesc bara de progres exact prin această funcție PHP.

Poate o aplicație să reactiveze funcția?

Printr-un fișier .htaccess la mod_php sau un .user.ini la PHP-FPM, acest lucru este posibil în principiu, atâta timp cât valoarea nu este blocată. Cu php_admin_flag în pool sau în configurația Apache îl împiedicați.

Trebuie să resetez valoarea după următoarea actualizare PHP?

Nu, nu este necesar. Funcția nu este folosită de majoritatea aplicațiilor, iar manualul PHP recomandă el însuși dezactivarea ei în astfel de cazuri. După fiecare actualizare verificați doar dacă valoarea se mai aplică.

Surse

Contact imediat

Fiecare oră contează. Scrieți-ne acum.

Descrieți pe scurt sistemul, versiunea PHP și ce ați observat. Ne vom face auziți, clarificăm situația și lucrăm la distanță până când incidentul este încheiat și documentat.

Ajutor imediat