Röviden: Állítsa be a session.upload_progress.enabled=0 értéket a php.ini-ben, a PHP-FPM-poolban vagy az Apache szerverkonfigurációjában, soha nem az ini_set()-tel vagy a .user.ini-vel, majd indítsa újra az összes PHP-workert. Az intézkedés csak akkor válik tartóssá, ha az érték zárolva van a visszakapcsolás ellen, minden üzemmódban és minden telepített PHP-verzióban érvényes, és a frissítések után ellenőrzik.
Egy kis beállítás kettős hatással
Ritkán kapott egyetlen PHP-beállítás ennyi figyelmet. Amikor a php.net 2026. október 21-én közzétette a PHP2Shell elleni javításokat, a session.upload_progress.enabled=0 az átmeneti intézkedések listáján állt. Két nappal később jött a CVE-2026-115560-ra vonatkozó tudnivaló, és az ajánlott megoldás ugyanaz a beállítás volt.
Sok adminisztrátor ezekben a napokban gyorsan beállította. Hogy mindenhol hat-e, az egy másik kérdés. A tipikus hézagokat gyorsan fel lehet sorolni: az érték csak a CLI-konfigurációban áll, egy második PHP-verziót elfelejtettek, vagy egy tárhelypanel a következő mentéskor felülírta a fájlt. Ez a cikk megmutatja, hogyan valósítsa meg az intézkedést úgy, hogy három hónap múlva is érvényes legyen.
Fontos előre: a kikapcsolás nem pótolja a PHP-frissítést. Szakmai beszámolók szerint a session.upload_progress.enabled=0 önmagában nem zárja le mindkét PHP2Shell-rést. Hogy a CVE-2026-115560 pontosan mit érint, azt a CVE-2026-115560: a session upload progress tudnivaló oldal magyarázza.
Mit csinál a funkció, és kinek kell
A session upload progress egy fájlfeltöltés közben folyamatosan a munkamenetbe írja az előrehaladást, hogy egy alkalmazás előrehaladásjelzőt jeleníthessen meg. A PHP-ban a funkció alapértelmezetten be van kapcsolva. A PHP kézikönyve maga is rámutat, hogy ekkor a feladó által szállított fájl- és mezőnevek ellenőrizetlenül kerülnek a munkamenet-tárba, és azt javasolja, hogy kapcsolják ki a funkciót, ha az alkalmazás nem használja.
Hogy az Ön alkalmazása használja-e, azt egy tisztán olvasó kódkereséssel tudhatja meg:
# Az előrehaladás-funkció használatát keresi az alkalmazáskódban
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/
Ha a keresés nem talál semmit, a funkciót érezhető következmények nélkül kikapcsolhatja. Ha vannak találatok, az alkalmazás csak az előrehaladásjelzőt veszíti el, a feltöltést nem. A modern űrlapok az előrehaladást úgyis többnyire a böngészőben mérik.
A session.upload_progress.enabled beállítása a megfelelő helyen
A beállítás a PHP kézikönyve szerint az INI_PERDIR módú. Ez azt jelenti: beállítható a php.ini-ben, a szerverkonfigurációban, a .htaccess-ben (csak mod_php) és a .user.ini-ben (csak FPM és CGI), de futásidőben nem. A php.net a .user.ini-t az intézkedés helyeként kifejezetten kizárja. A következő táblázat üzemmódonként mutatja az értelmes helyeket.
| Üzemmód | Ajánlott hely | Zárol a felülírás ellen? | Utána újraindítandó |
|---|---|---|---|
| PHP-FPM | a pool fájlja php_admin_flag-gel |
igen | minden FPM-szolgáltatás |
| PHP-FPM | az FPM SAPI php.ini-je | nem, a .user.ini felülírhatja |
minden FPM-szolgáltatás |
| Apache mod_php-val | VirtualHost vagy szerverkonfiguráció php_admin_flag-gel |
igen | az Apache teljesen |
| php-cgi, LiteSpeed, FrankenPHP | az adott futtatókörnyezet php.ini-je | felépítéstől függően ellenőrizni | a futtatókörnyezet összes folyamata |
| Docker-image | saját fájl a /usr/local/etc/php/conf.d/ alatt építéskor |
igen, ha nincs felülírás engedélyezve | a konténert újra létrehozni |
A két robusztus változat így néz ki:
; PHP-FPM, pl. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
# Apache mod_php-val, a VirtualHostban vagy szerverszinten
<IfModule php_module>
php_admin_flag session.upload_progress.enabled off
</IfModule>
Ezenkívül megéri a bejegyzés minden webes SAPI php.ini-jében alapértékként. Ekkor a beállítás azokra az új poolokra is érvényes, amelyeket később valaki létrehoz. Hogy a php_admin_flag miért hoz különbséget, azt a php_admin_value: beállítások zárolása a felülírás ellen cikk írja le.
A hatékonyság ellenőrzése webkörnyezetben
A parancssor gyakran más php.ini-t olvas, mint a webszerver. A php -i ezért keveset bizonyít. A php-fpm8.3 -i is csak a php.ini értékeit mutatja, nem a poolokban lévő bejegyzéseket. Megbízható csak az a lekérdezés, amely ténylegesen a poolon keresztül fut.
Így járjon el:
- Indítsa újra az összes PHP-szolgáltatást, például
systemctl restart php8.3-fpm, vagy az Apache-ot mod_php esetén. Újraindítás nélkül a régi érték fut tovább. - Helyezzen a webrootba egy rövid, véletlenszerű nevű ellenőrző fájlt, amely csak az aktuális értéket írja ki.
- Hívja meg egyszer a fájlt a valódi domainen keresztül, és jegyezze fel az eredményt.
- Azonnal törölje a fájlt újra, és ismételje meg a lépést minden weboldalra és minden poolra.
<?php
// Ellenőrző fájl: csak rövid időre helyezze el, utána azonnal törölje
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";
Üres érték vagy '0' az elvárt. Ha '1' áll ott, a beállítása ebben a poolban nem hat. Egy PHP-frissítés után ezenkívül ellenőrizze, hogy az összes worker újra lett-e indítva, ahogyan a PHP-FPM és az összes worker újraindítása leírja.
Ellenőrző fájlokat soha ne hagyjon ott. Elárulják a verziókat és a konfigurációt, és az automatizált vizsgálatok kedvelt célpontjai.
Hogy a beállítás tartósan megmaradjon
A legtöbb visszaesést nem a támadók okozzák, hanem az üzemeltetés. Egy új poolt egy régi sablonból másolnak, egy csomagfrissítés új php.ini-t hoz létre, vagy valaki átállítja a PHP-verziót a tárhelypanelben. Az ilyen visszaesések ellen szilárd szokások segítenek.
- Minden verziót lefedni: Sok szerveren több PHP-verzió fut párhuzamosan. Mindegyiknek saját konfigurációs mappái vannak, és szüksége van a bejegyzésre.
- Sablonokat igazítani: A pool-sablonok, Ansible-szerepek, Dockerfile-ok és panelsablonok tartalmazzák az értéket, hogy az új weboldalak automatikusan örököljék.
- A panelbeállításokat használni: A tárhelypaneleknél az érték a panel által előirányzott kiegészítő direktívákba való, különben a következő módosítás felülírja a kézi munkát.
- Frissítések után ellenőrizni: Az előző szakasz ellenőrzése minden PHP-frissítés ellenőrzőlistájához tartozik.
- Dokumentálni: Rögzítse a dátumot, a szervert, a poolokat és az eredményt. Ez később segít a vezetés, a biztosító vagy a vizsgálók felé.
Aki a .user.ini-t egyáltalán nem használja, az ilyen fájlok beolvasását a php.ini-ben a user_ini.filename = beállítással teljesen kikapcsolhatja. Ez azonban minden olyan beállítást érint, amelyet az alkalmazások ott helyeznek el. Ezt a lépést ezért előtte tesztelje, különösen olyan CMS-eknél, amelyek saját .user.ini fájlokat írnak.
A php.net további átmeneti intézkedései, például a post_max_size határai és a cgroupon keresztüli memóriahatár, összegyűjtve az Azonnali intézkedések, ha még nem tud javítani oldalon találhatók. Hogyan rendezi a PHP alapvetően a konfigurációs szintjeit, azt A php.ini magyarázata írja le.
Hogyan segít konkrétan a PHP SOS?
- A készlet felvétele: Megállapítjuk a szerverein lévő összes PHP-verziót, üzemmódot és poolt, és kiolvassuk a webkörnyezetben érvényes értékeket.
- Tiszta beállítás: A beállítást zárolva írjuk be a poolokba és a szerverkonfigurációba, és az összes workert ellenőrzötten újraindítjuk.
- A működés tesztelése: A feltöltési űrlapokat és a médiakezelést az átállás után ellenőrizzük.
- A visszaesések megakadályozása: A sablonokat, telepítéseket és panelbeállításokat igazítjuk, és az állapotot a szerverkeményítés keretében dokumentáljuk.
Gyakori kérdések
Miért nem hat a session.upload_progress.enabled=0 az ini_set()-en keresztül?
A PHP kézikönyve szerint a beállítás az INI_PERDIR módhoz tartozik. Ezért egyáltalán nem módosítható futásidőben az ini_set()-tel. A php.net helyes helyként a php.ini-t, az FPM-poolt vagy a szerverkonfigurációt nevezi meg, a .user.ini-t kifejezetten kizárja.
Működnek még a fájlfeltöltések a kikapcsolás után?
Igen. Csak az az előrehaladási jelzés kapcsol ki, amelyet a PHP a feltöltés közben a munkamenetbe ír. Maga a feltöltés tovább fut. Csak azok az alkalmazások érintettek, amelyek az előrehaladásjelzőjüket éppen erre a PHP-funkcióra építik.
Visszakapcsolhatja egy alkalmazás a funkciót?
Mod_php esetén egy .htaccess fájlon, PHP-FPM esetén egy .user.ini-n keresztül elvileg lehetséges, amíg az érték nincs zárolva. A poolban vagy az Apache-konfigurációban lévő php_admin_flag-gel ezt megakadályozza.
Vissza kell állítanom az értéket a következő PHP-frissítés után?
Nem, ez nem szükséges. A funkciót az alkalmazások többsége nem használja, és a PHP kézikönyve maga is azt javasolja, hogy ilyen esetekben kapcsolják ki. Minden frissítés után csak azt ellenőrizze, hogy az érték még érvényes-e.