Lyhyesti: Asettakaa session.upload_progress.enabled=0 tiedostossa php.ini, PHP-FPM-poolissa tai Apachen palvelinasetuksissa, älkää koskaan funktiolla ini_set() tai tiedostossa .user.ini, ja käynnistäkää sen jälkeen kaikki PHP-workerit uudelleen. Toimenpide on pysyvä vasta, kun arvo on lukittu uudelleenkäyttöönotolta, se on voimassa jokaisessa käyttötavassa ja jokaisessa asennetussa PHP-versiossa ja se tarkistetaan päivitysten jälkeen.
Pieni asetus kaksinkertaisella vaikutuksella
Harvoin yksittäinen PHP-asetus on saanut näin paljon huomiota. Kun php.net julkaisi 21. lokakuuta 2026 korjaukset PHP2Shelliä vastaan, session.upload_progress.enabled=0 oli siirtymäajan toimenpiteiden listalla. Kaksi päivää myöhemmin seurasi CVE-2026-115560:tä koskeva huomautus, ja suositeltu keino oli sama asetus.
Moni ylläpitäjä asetti sen näinä päivinä nopeasti. Toimiiko se kaikkialla, on eri kysymys. Tyypilliset aukot luetellaan nopeasti: arvo on vain CLI-asetuksissa, toinen PHP-versio unohtui, tai hosting-paneeli ylikirjoitti tiedoston seuraavassa tallennuksessa. Tämä kirjoitus näyttää, miten toteutatte toimenpiteen niin, että se on voimassa vielä kolmen kuukauden päästä.
Tärkeä huomio etukäteen: käytöstä poisto ei korvaa PHP-päivitystä. Ammattiraporttien mukaan session.upload_progress.enabled=0 yksin ei sulje molempia PHP2Shell-aukkoja. Mitä CVE-2026-115560 tarkalleen koskee, selittää sivu CVE-2026-115560: Session-upload-progress-huomautus.
Mitä toiminto tekee ja kuka sitä tarvitsee
Session-upload-progress kirjoittaa tiedostolatauksen aikana jatkuvasti edistymisen sessioon, jotta sovellus voi näyttää edistymispalkin. PHP:ssä toiminto on oletuksena päällä. PHP-käsikirja itse huomauttaa, että lähettäjän toimittamat tiedosto- ja kenttänimet päätyvät tällöin tarkistamattomina sessiomuistiin, ja suosittelee toiminnon kytkemistä pois, jos sovellus ei käytä sitä.
Käyttääkö sovelluksenne sitä, selviää pelkästään lukevalla koodihaulla:
# Etsii edistymistoiminnon käyttöjä sovelluskoodista
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/
Jos haku ei löydä mitään, toiminnon voi kytkeä pois ilman huomattavia seurauksia. Jos osumia on, sovellus menettää vain edistymisnäytön, ei latausta. Nykyaikaiset lomakkeet mittaavat edistymisen yleensä joka tapauksessa selaimessa.
session.upload_progress.enabled oikeaan paikkaan
Asetuksen tila on PHP-käsikirjan mukaan INI_PERDIR. Se tarkoittaa: sen voi asettaa tiedostossa php.ini, palvelinasetuksissa, .htaccess-tiedostossa (vain mod_php) ja .user.ini-tiedostossa (vain FPM ja CGI), mutta ei suoritusaikana. php.net sulkee .user.ini:n toimenpiteen paikkana nimenomaisesti pois. Seuraava taulukko näyttää järkevät paikat käyttötavoittain.
| Käyttötapa | Suositeltu paikka | Lukitseeko ylikirjoitukselta? | Uudelleenkäynnistys sen jälkeen |
|---|---|---|---|
| PHP-FPM | pool-tiedosto komennolla php_admin_flag |
kyllä | jokainen FPM-palvelu |
| PHP-FPM | FPM-SAPI:n php.ini | ei, .user.ini voisi ylikirjoittaa |
jokainen FPM-palvelu |
| Apache mod_php:llä | VirtualHost tai palvelinasetukset komennolla php_admin_flag |
kyllä | Apache kokonaan |
| php-cgi, LiteSpeed, FrankenPHP | kyseisen ajoympäristön php.ini | tarkistettava rakenteen mukaan | kaikki ajoympäristön prosessit |
| Docker-image | oma tiedosto hakemistossa /usr/local/etc/php/conf.d/ rakennuksessa |
kyllä, jos ohitusta ei sallita | luokaa kontti uudelleen |
Kaksi kestävää vaihtoehtoa näyttävät tältä:
; PHP-FPM, esim. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
# Apache mod_php:n kanssa, VirtualHostissa tai palvelinlaajuisesti
<IfModule php_module>
php_admin_flag session.upload_progress.enabled off
</IfModule>
Lisäksi kannattaa tehdä merkintä jokaisen verkko-SAPI:n php.ini-tiedostoon perusarvoksi. Silloin asetus on voimassa myös uusille pooleille, jotka joku luo myöhemmin. Miksi php_admin_flag tekee eron, kuvaa kirjoitus php_admin_value: asetusten lukitseminen ylikirjoitukselta.
Tehokkuuden tarkistus verkkokontekstissa
Komentorivi lukee usein eri php.ini-tiedoston kuin verkkopalvelin. Komento php -i todistaa siksi vähän. Myös php-fpm8.3 -i näyttää vain php.ini-arvot, ei pooleista tulevia merkintöjä. Luotettava on vain kysely, joka todella kulkee poolin kautta.
Toimikaa näin:
- Käynnistäkää kaikki PHP-palvelut uudelleen, esimerkiksi
systemctl restart php8.3-fpmtai Apache mod_php:n kanssa. Ilman uudelleenkäynnistystä vanha arvo pysyy voimassa. - Asettakaa verkkojuureen lyhyt tarkistustiedosto satunnaisella nimellä, joka tulostaa vain nykyisen arvon.
- Kutsukaa tiedostoa kerran oikean verkkotunnuksen kautta ja kirjatkaa tulos.
- Poistakaa tiedosto heti ja toistakaa vaihe jokaiselle verkkosivustolle ja jokaiselle poolille.
<?php
// Tarkistustiedosto: pidä vain hetki, poista heti sen jälkeen
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";
Odotettu arvo on tyhjä tai '0'. Jos siellä on '1', asetuksenne ei ole voimassa tässä poolissa. PHP-päivityksen jälkeen tarkistakaa lisäksi, että kaikki workerit on käynnistetty uudelleen, kuten kuvataan kohdassa PHP-FPM ja kaikkien workerien uudelleenkäynnistys.
Älkää koskaan jättäkö tarkistustiedostoja paikalleen. Ne paljastavat versioita ja asetuksia ja ovat suosittu kohde automatisoiduille skannauksille.
Jotta asetus pysyy pysyvänä
Useimmat takaiskut eivät johdu hyökkääjistä vaan käytöstä. Uusi pooli kopioidaan vanhasta mallipohjasta, pakettipäivitys luo uuden php.ini-tiedoston tai joku vaihtaa PHP-version hosting-paneelissa. Tällaisia takaiskuja vastaan auttavat vakiintuneet tavat.
- Kattakaa kaikki versiot: Monella palvelimella pyörii useita PHP-versioita rinnakkain. Jokaisella on omat asetuskansionsa ja se tarvitsee merkinnän.
- Mukauttakaa mallipohjat: Pool-mallipohjat, Ansible-roolit, Dockerfile-tiedostot ja paneelin mallipohjat sisältävät arvon, jotta uudet verkkosivustot perivät sen automaattisesti.
- Käyttäkää paneelin asetuksia: Hosting-paneeleissa arvon paikka on paneelin tarjoamissa lisädirektiiveissä, muuten seuraava muutos ylikirjoittaa käsityön.
- Tarkistakaa päivitysten jälkeen: Edellisen osion tarkistus kuuluu jokaisen PHP-päivityksen tarkistuslistaan.
- Dokumentoikaa: Kirjatkaa päivämäärä, palvelin, poolit ja tulos. Se auttaa myöhemmin suhteessa johtoon, vakuutusyhtiöön tai tarkastajiin.
Joka ei käytä .user.ini-tiedostoa lainkaan, voi kytkeä tällaisten tiedostojen lukemisen kokonaan pois asetuksella user_ini.filename = tiedostossa php.ini. Se koskee kuitenkin kaikkia asetuksia, joita sovellukset tallentavat sinne. Testatkaa tämä vaihe siksi etukäteen, erityisesti CMS:illä, jotka kirjoittavat omia .user.ini-tiedostojaan.
php.net:n muut siirtymäajan toimenpiteet, kuten post_max_size-rajat ja cgroup-muistiraja, on koottu kohtaan Pikatoimet, jos ette voi vielä päivittää. Miten PHP järjestää asetustasonsa periaatteessa, selittää php.ini selitettynä.
Miten PHP SOS auttaa konkreettisesti?
- Kartoitus: Selvitämme palvelimillanne kaikki PHP-versiot, käyttötavat ja poolit ja luemme voimassa olevat arvot verkkokontekstissa.
- Oikea asetus: Kirjaamme asetuksen lukittuna pooleihin ja palvelinasetuksiin ja käynnistämme kaikki workerit hallitusti uudelleen.
- Toiminnon testaus: Tarkistamme latauslomakkeet ja mediahallinnan muutoksen jälkeen.
- Takaiskujen esto: Mukautamme mallipohjat, käyttöönotot ja paneelin asetukset ja dokumentoimme tilan palvelimen koventamisen yhteydessä.
Usein kysytyt kysymykset
Miksi session.upload_progress.enabled=0 ei vaikuta funktion ini_set() kautta?
Asetus kuuluu PHP-käsikirjan mukaan tilaan INI_PERDIR. Siksi sitä ei voi lainkaan muuttaa suoritusaikana funktiolla ini_set(). php.net nimeää oikeiksi paikoiksi tiedoston php.ini, FPM-poolin tai palvelinasetukset ja sulkee .user.ini-tiedoston nimenomaisesti pois.
Toimivatko tiedostolataukset yhä käytöstä poiston jälkeen?
Kyllä. Pois kytketään vain edistymisilmoitus, jonka PHP kirjoittaa sessioon latauksen aikana. Itse lataus jatkuu. Vaikutuksen alaisia ovat vain sovellukset, jotka rakentavat edistymispalkkinsa juuri tällä PHP-toiminnolla.
Voiko sovellus ottaa toiminnon uudelleen käyttöön?
mod_php:n kanssa .htaccess-tiedoston tai PHP-FPM:n kanssa .user.ini-tiedoston kautta se on periaatteessa mahdollista, jos arvoa ei ole lukittu. Komennolla php_admin_flag poolissa tai Apachen asetuksissa estätte sen.
Pitääkö arvo asettaa takaisin seuraavan PHP-päivityksen jälkeen?
Ei, se ei ole tarpeen. Useimmat sovellukset eivät tarvitse toimintoa, ja PHP-käsikirja itse neuvoo kytkemään sen pois tällaisissa tapauksissa. Tarkistakaa jokaisen päivityksen jälkeen vain, onko arvo yhä voimassa.