# Isključiti session.upload_progress: ispravno i trajno

> Pravilno postavite session.upload_progress.enabled=0: gdje vrijedi, kako ga zaključati od ponovnog uključivanja i kako ga sigurno provjeriti u web-kontekstu.

Izvor: https://phpsos.de/hr/blog/session-upload-progress-abschalten/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** Postavite `session.upload_progress.enabled=0` u php.ini, u PHP-FPM poolu ili u Apache konfiguraciji poslužitelja, nikada putem `ini_set()` ili `.user.ini`, a zatim ponovno pokrenite sve PHP workere. Mjera postaje trajna tek kad je vrijednost zaključana od ponovnog uključivanja, vrijedi u svakom načinu rada i svakoj instaliranoj verziji PHP-a te se provjerava nakon ažuriranja.

## Mala postavka s dvostrukim učinkom

Rijetko je jedna PHP postavka dobila toliko pozornosti. Kad je php.net 21. listopada 2026. objavio zakrpe za PHP2Shell, `session.upload_progress.enabled=0` našao se na popisu prijelaznih mjera. Dva dana kasnije uslijedila je napomena o CVE-2026-115560, a preporučena zaštita bila je ista postavka.

Mnogi su je administratori tih dana brzo postavili. Djeluje li posvuda, drugo je pitanje. Tipične praznine brzo se nabrajaju: vrijednost stoji samo u CLI konfiguraciji, druga verzija PHP-a je zaboravljena ili je hosting panel pri sljedećem spremanju prepisao datoteku. Ovaj članak pokazuje kako mjeru provesti tako da vrijedi i za tri mjeseca.

Važno unaprijed: isključivanje ne zamjenjuje PHP ažuriranje. Prema stručnim izvješćima sam `session.upload_progress.enabled=0` ne zatvara obje ranjivosti PHP2Shella. Što se točno tiče CVE-2026-115560, objašnjava stranica [CVE-2026-115560: napomena o Session Upload Progressu](https://phpsos.de/hr/php2shell/cve-2026-115560/).

## Što funkcija radi i kome treba

Session Upload Progress tijekom prijenosa datoteke neprekidno upisuje napredak u sesiju kako bi aplikacija mogla prikazati traku napretka. U PHP-u je funkcija zadano uključena. PHP priručnik sam upozorava da pritom nazivi datoteka i polja koje isporuči pošiljatelj završavaju neprovjereni u memoriji sesije i preporučuje isključiti funkciju ako je aplikacija ne koristi.

Koristi li je Vaša aplikacija, saznat ćete pretragom koda koja samo čita:

```bash
# Traži upotrebe funkcije napretka u kodu aplikacije
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/
```

Ako pretraga ništa ne pronađe, funkciju možete isključiti bez osjetnih posljedica. Ako ima pogodaka, aplikacija gubi samo prikaz napretka, a ne prijenos. Suvremeni obrasci napredak ionako uglavnom mjere u pregledniku.

## session.upload_progress.enabled postaviti na pravom mjestu

Postavka prema PHP priručniku ima način `INI_PERDIR`. To znači: može se postaviti u php.ini, u konfiguraciji poslužitelja, u `.htaccess` (samo mod_php) i u `.user.ini` (samo FPM i CGI), ali ne tijekom rada. php.net `.user.ini` izričito isključuje kao mjesto za mjeru. Sljedeća tablica prikazuje smislena mjesta po načinu rada.

| Način rada | Preporučeno mjesto | Zaključava od nadjačavanja? | Nakon toga ponovno pokrenuti |
|---|---|---|---|
| PHP-FPM | datoteka poola s `php_admin_flag` | da | svaku FPM uslugu |
| PHP-FPM | php.ini FPM SAPI-ja | ne, `.user.ini` bi mogao nadjačati | svaku FPM uslugu |
| Apache s mod_php | VirtualHost ili konfiguracija poslužitelja s `php_admin_flag` | da | Apache u cijelosti |
| php-cgi, LiteSpeed, FrankenPHP | php.ini dotičnog izvršnog okruženja | provjeriti prema izvedbi | sve procese okruženja |
| Docker image | vlastita datoteka u `/usr/local/etc/php/conf.d/` pri izgradnji | da, ako nadjačavanje nije dopušteno | ponovno izraditi kontejner |

Dvije otporne varijante izgledaju ovako:

```ini
; PHP-FPM, npr. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
```

```apache
# Apache s mod_php, u VirtualHostu ili na razini cijelog poslužitelja
<IfModule php_module>
    php_admin_flag session.upload_progress.enabled off
</IfModule>
```

Dodatno se isplati unos u php.ini svakog web SAPI-ja kao osnovna vrijednost. Tada postavka vrijedi i za nove poolove koje netko kasnije izradi. Zašto `php_admin_flag` čini razliku, opisuje članak [php_admin_value: zaključati postavke od nadjačavanja](https://phpsos.de/hr/blog/php-admin-value-sperren/).

## Provjeriti djelotvornost u web-kontekstu

Naredbeni redak često čita drugu php.ini od web-poslužitelja. `php -i` stoga dokazuje malo. Ni `php-fpm8.3 -i` ne pokazuje unose iz poolova, nego samo vrijednosti iz php.ini. Pouzdan je samo upit koji se doista izvršava preko poola.

Postupak:

1. Ponovno pokrenite sve PHP usluge, primjerice `systemctl restart php8.3-fpm` ili Apache kod mod_php-a. Bez ponovnog pokretanja stara vrijednost nastavlja vrijediti.
2. U web-korijen odložite kratku datoteku za provjeru s nasumičnim nazivom koja ispisuje samo trenutačnu vrijednost.
3. Datoteku jednom pozovite preko prave domene i zabilježite rezultat.
4. Datoteku odmah izbrišite i korak ponovite za svaku web-stranicu i svaki pool.

```php
<?php
// Datoteka za provjeru: odložiti samo nakratko, zatim odmah izbrisati
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";
```

Očekuje se prazna vrijednost ili `'0'`. Ako tamo stoji `'1'`, Vaša postavka u tom poolu ne djeluje. Nakon ažuriranja PHP-a dodatno provjerite jesu li svi workeri ponovno pokrenuti, kako je opisano u članku [Ponovno pokrenuti PHP-FPM i sve workere](https://phpsos.de/hr/php2shell/php-fpm-neustart/).

> **Važno:**
> Datoteke za provjeru nikad ne ostavljajte. Otkrivaju verzije i konfiguraciju i omiljena su meta automatiziranih skeniranja.

## Da postavka ostane trajno

Većina povrata ne nastaje zbog napadača, nego zbog rada. Novi pool kopira se iz starog predloška, ažuriranje paketa izrađuje novu php.ini ili netko u hosting panelu promijeni verziju PHP-a. Protiv takvih povrata pomažu čvrste navike.

- **Pokriti sve verzije:** na mnogim poslužiteljima paralelno radi više verzija PHP-a. Svaka ima vlastite konfiguracijske mape i treba unos.
- **Prilagoditi predloške:** predlošci poolova, Ansible uloge, Dockerfileovi i predlošci panela sadrže vrijednost kako bi je nove web-stranice automatski naslijedile.
- **Koristiti postavke panela:** u hosting panelima vrijednost pripada u dodatne direktive koje panel predviđa, inače sljedeća izmjena prepisuje ručni rad.
- **Provjeravati nakon ažuriranja:** provjera iz prethodnog odjeljka pripada u kontrolni popis svakog PHP ažuriranja.
- **Dokumentirati:** zabilježiti datum, poslužitelj, poolove i rezultat. To kasnije pomaže prema upravi, osiguravatelju ili revizorima.

Tko `.user.ini` uopće ne koristi, može učitavanje takvih datoteka potpuno isključiti pomoću `user_ini.filename =` u php.ini. To se ipak odnosi na sve postavke koje aplikacije tamo odlažu. Zato taj korak prethodno testirajte, osobito kod CMS-ova koji pišu vlastite `.user.ini` datoteke.

Ostale prijelazne mjere php.net-a, primjerice granice za `post_max_size` i granicu memorije putem cgroupa, skupljene su na stranici [Hitne mjere ako još ne možete zakrpati](https://phpsos.de/hr/php2shell/sofortmassnahmen-ohne-patch/). Kako PHP načelno uređuje svoje razine konfiguracije, objašnjava članak [php.ini objašnjen](https://phpsos.de/hr/php/php-ini-erklaert/).

## Kako PHP SOS konkretno pomaže?

- **Zabilježiti stanje:** utvrđujemo sve verzije PHP-a, načine rada i poolove na Vašim poslužiteljima i očitavamo djelotvorne vrijednosti u web-kontekstu.
- **Čisto postaviti:** postavku upisujemo zaključanu u poolove i konfiguraciju poslužitelja te kontrolirano ponovno pokrećemo sve workere.
- **Testirati funkciju:** obrasce za prijenos i upravljanje medijima provjeravamo nakon prijelaza.
- **Spriječiti povrate:** predloške, deploymente i postavke panela prilagođavamo i stanje dokumentiramo u sklopu [ojačavanja poslužitelja](https://phpsos.de/hr/leistungen/server-haertung/).


## Česta pitanja

**Zašto session.upload_progress.enabled=0 ne djeluje putem ini_set()?**  
Postavka prema PHP priručniku pripada načinu INI_PERDIR. Zato se uopće ne može mijenjati tijekom rada putem ini_set(). php.net kao ispravna mjesta navodi php.ini, FPM pool ili konfiguraciju poslužitelja, a .user.ini izričito isključuje.

**Rade li prijenosi datoteka i nakon isključivanja?**  
Rade. Isključuje se samo obavijest o napretku koju PHP tijekom prijenosa upisuje u sesiju. Sam prijenos teče dalje. Pogođene su samo aplikacije koje svoju traku napretka grade upravo na toj PHP funkciji.

**Može li aplikacija funkciju ponovno uključiti?**  
Putem datoteke .htaccess kod mod_php-a ili .user.ini kod PHP-FPM-a to je u načelu moguće, dok vrijednost nije zaključana. Pomoću php_admin_flag u poolu ili u Apache konfiguraciji to sprječavate.

**Moram li vrijednost vratiti nakon sljedećeg ažuriranja PHP-a?**  
Ne, to nije potrebno. Većini aplikacija funkcija nije potrebna, a PHP priručnik sam savjetuje da se u takvim slučajevima isključi. Nakon svakog ažuriranja provjerite samo vrijedi li vrijednost još.

## Izvori

- [php.net: sigurnosne obavijesti](https://www.php.net/)
- [PHP priručnik: konfiguracija sesija](https://www.php.net/manual/en/session.configuration.php)
- [PHP priručnik: datoteke .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
