Lühidalt: Seadke session.upload_progress.enabled=0 failis php.ini, PHP-FPM-poolis või Apache'i serverikonfiguratsioonis, mitte kunagi käsuga ini_set() ega failis .user.ini, ning taaskäivitage seejärel kõik PHP töölised. Püsivaks muutub meede alles siis, kui väärtus on tagasilülitamise vastu lukustatud, kehtib igas töörežiimis ja igas paigaldatud PHP versioonis ning seda kontrollitakse pärast uuendusi.
Väike säte kahekordse mõjuga
Harva on üksik PHP säte saanud nii palju tähelepanu. Kui php.net 21. oktoobril 2026 PHP2Shelli vastu paigad avaldas, oli session.upload_progress.enabled=0 üleminekumeetmete loendis. Kaks päeva hiljem järgnes märge CVE-2026-115560 kohta ja soovitatud abinõu oli sama säte.
Paljud administraatorid seadsid selle nendel päevadel kiiresti. Kas see igal pool mõjub, on teine küsimus. Tüüpilised lüngad on kiiresti loetletud: väärtus on ainult CLI konfiguratsioonis, teine PHP versioon unustati või majutuspaneel kirjutas faili järgmisel salvestamisel üle. See artikkel näitab, kuidas meedet rakendada nii, et see kehtib ka kolme kuu pärast.
Oluline enne: väljalülitamine ei asenda PHP uuendust. Erialaaruannete järgi ei sulge session.upload_progress.enabled=0 üksi mõlemat PHP2Shelli auku. Mida CVE-2026-115560 täpselt mõjutab, selgitab leht CVE-2026-115560: märge sessiooni üleslaadimisedenemise kohta.
Mida funktsioon teeb ja kes seda vajab
Session-Upload-Progress kirjutab faili üleslaadimise ajal edenemise jooksvalt sessiooni, et rakendus saaks kuvada edenemisriba. PHP-s on funktsioon vaikimisi sisse lülitatud. PHP käsiraamat ise juhib tähelepanu, et seejuures satuvad saatja antud faili- ja väljanimed kontrollimata sessioonimällu, ning soovitab funktsiooni välja lülitada, kui rakendus seda ei kasuta.
Kas teie rakendus seda kasutab, saate teada puhtalt lugeva otsinguga koodis:
# Otsib edenemisfunktsiooni kasutusi rakenduse koodis
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/
Kui otsing midagi ei leia, saate funktsiooni märgatavate tagajärgedeta välja lülitada. Kui on tabamusi, kaotab rakendus ainult edenemiskuva, mitte üleslaadimise. Kaasaegsed vormid mõõdavad edenemist enamasti niikuinii brauseris.
session.upload_progress.enabled seadmine õiges kohas
Sättel on PHP käsiraamatu järgi režiim INI_PERDIR. See tähendab: seda saab seada failis php.ini, serverikonfiguratsioonis, failis .htaccess (ainult mod_php) ja failis .user.ini (ainult FPM ja CGI), kuid mitte töö ajal. php.net välistab .user.ini meetme kohana otsesõnu. Järgmine tabel näitab mõistlikud kohad töörežiimi kaupa.
| Töörežiim | Soovitatav koht | Kas lukustab ülekirjutamise vastu? | Seejärel taaskäivitada |
|---|---|---|---|
| PHP-FPM | pooli fail käsuga php_admin_flag |
jah | iga FPM-teenus |
| PHP-FPM | FPM SAPI php.ini | ei, .user.ini võiks üle kirjutada |
iga FPM-teenus |
| Apache mod_php-ga | VirtualHost või serverikonfiguratsioon käsuga php_admin_flag |
jah | Apache täielikult |
| php-cgi, LiteSpeed, FrankenPHP | vastava käitusaja php.ini | kontrollige ülesehituse järgi | kõik käitusaja protsessid |
| Docker-kujutis | oma fail kaustas /usr/local/etc/php/conf.d/ ehitamisel |
jah, kui ülekirjutamine pole lubatud | looge konteiner uuesti |
Kaks töökindlat varianti näevad välja nii:
; PHP-FPM, nt /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
# Apache mod_php-ga, VirtualHostis või serveriülesena
<IfModule php_module>
php_admin_flag session.upload_progress.enabled off
</IfModule>
Lisaks tasub kirje iga veebi-SAPI php.ini-s põhiväärtusena. Siis kehtib säte ka uutele poolidele, mille keegi hiljem loob. Miks php_admin_flag vahe teeb, kirjeldab artikkel php_admin_value: sätete kaitsmine ülekirjutamise eest.
Toimivuse kontroll veebikontekstis
Käsurida loeb sageli teist php.ini-d kui veebiserver. php -i seetõttu vähe tõestab. Ka php-fpm8.3 -i näitab ainult php.ini väärtusi, mitte poolide kirjeid. Usaldusväärne on ainult päring, mis tegelikult poolis jookseb.
Toimige nii:
- Taaskäivitage kõik PHP teenused, näiteks
systemctl restart php8.3-fpmvõi mod_php puhul Apache. Ilma taaskäivituseta jätkab vana väärtus. - Pange veebijuurkataloogi juhusliku nimega lühike kontrollfail, mis väljastab ainult praeguse väärtuse.
- Avage fail üks kord tegeliku domeeni kaudu ja märkige tulemus üles.
- Kustutage fail kohe uuesti ja korrake sammu iga veebisaidi ja iga pooli jaoks.
<?php
// Kontrollfail: pange alles ainult korraks, seejärel kustutage kohe
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";
Oodatav on tühi väärtus või '0'. Kui seal on '1', ei rakendu teie säte selles poolis. Pärast PHP uuendust kontrollige lisaks, kas kõik töölised on taaskäivitatud, nagu on kirjeldatud lehel PHP-FPM-i ja kõigi töölisprotsesside taaskäivitamine.
Ärge jätke kontrollfaile kunagi seisma. Need reedavad versioone ja konfiguratsiooni ning on automatiseeritud skannimiste lemmiksihtmärk.
Et säte püsima jääks
Enamik tagasilangusi ei teki ründajate, vaid töökorralduse tõttu. Uus pool kopeeritakse vanast mallist, paketiuuendus loob uue php.ini või keegi lülitab majutuspaneelis PHP versiooni ümber. Selliste tagasilangustega aitavad kindlad harjumused.
- Katke kõik versioonid: paljudes serverites töötab paralleelselt mitu PHP versiooni. Igaühel on oma konfiguratsioonikaustad ja see vajab kirjet.
- Kohandage mallid: pooli mallid, Ansible'i rollid, Dockerfile'id ja paneeli mallid sisaldavad väärtust, et uued veebisaidid selle automaatselt pärivad.
- Kasutage paneeli sätteid: majutuspaneelides kuulub väärtus paneeli ettenähtud lisadirektiividesse, muidu kirjutab järgmine muudatus käsitsitöö üle.
- Kontrollige pärast uuendusi: eelmise lõigu kontroll kuulub iga PHP uuenduse kontrollnimekirja.
- Dokumenteerige: märkige üles kuupäev, server, poolid ja tulemus. See aitab hiljem juhtkonna, kindlustaja või kontrollijate ees.
Kes .user.ini üldse ei kasuta, saab selliste failide sissevõtu failis php.ini sättega user_ini.filename = täiesti välja lülitada. See mõjutab aga kõiki sätteid, mida rakendused sinna panevad. Testige seda sammu seetõttu enne, eriti CMS-ides, mis kirjutavad oma .user.ini-faile.
php.net'i ülejäänud üleminekumeetmed, näiteks post_max_size piirid ja mälupiir cgroup'i kaudu, on koos lehel Kiirmeetmed, kui te ei saa veel paikama hakata. Kuidas PHP oma konfiguratsioonitasandeid üldiselt korraldab, selgitab php.ini selgitus.
Kuidas PHP SOS konkreetselt aitab?
- Seis üles võtta: selgitame välja kõik PHP versioonid, töörežiimid ja poolid teie serverites ning loeme veebikontekstis välja kehtivad väärtused.
- Seada puhtalt: kanname sätte lukustatuna poolidesse ja serverikonfiguratsiooni ning taaskäivitame kõik töölised kontrollitult.
- Testida funktsiooni: kontrollime pärast ümberlülitust üleslaadimisvorme ja meediahaldust.
- Vältida tagasilangusi: kohandame mallid, juurutused ja paneeli sätted ning dokumenteerime seisu serveri karastamise raames.
Korduma kippuvad küsimused
Miks session.upload_progress.enabled=0 ei mõju käsu ini_set() kaudu?
Säte kuulub PHP käsiraamatu järgi režiimi INI_PERDIR. Seda ei saa seetõttu töö ajal käsuga ini_set() üldse muuta. php.net nimetab õigete kohtadena faili php.ini, FPM-pooli või serverikonfiguratsiooni ning välistab .user.ini otsesõnu.
Kas failide üleslaadimine töötab pärast väljalülitamist edasi?
Jah. Välja lülitatakse ainult edenemisteade, mille PHP üleslaadimise ajal sessiooni kirjutab. Üleslaadimine ise jätkub. Mõjutatud on ainult rakendused, mis ehitavad oma edenemisriba just selle PHP funktsiooni peale.
Kas rakendus saab funktsiooni uuesti sisse lülitada?
Mod_php puhul faili .htaccess või PHP-FPM puhul faili .user.ini kaudu on see põhimõtteliselt võimalik, kuni väärtus pole lukustatud. Käsuga php_admin_flag poolis või Apache'i konfiguratsioonis takistate seda.
Kas pean väärtuse pärast järgmist PHP uuendust tagasi seadma?
Ei, see pole vajalik. Enamik rakendusi funktsiooni ei vaja ja PHP käsiraamat ise soovitab selle sellistel juhtudel välja lülitada. Kontrollige pärast iga uuendust ainult, kas väärtus ikka kehtib.