# Wyłączanie session.upload_progress: poprawnie i na stałe

> Poprawne ustawienie session.upload_progress.enabled=0: gdzie wartość działa, jak zablokować jej ponowne włączenie i jak sprawdzić ją w kontekście WWW.

Źródło: https://phpsos.de/pl/blog/session-upload-progress-abschalten/  
Stan: 25.10.2026  
Dostawca: PHP SOS, Pomoc awaryjna PHP i bezpieczeństwo serwerów. Natychmiastowa pomoc przez WhatsApp: https://wa.me/491736494914?text=Dzie%C5%84%20dobry%2C%20PHP%20SOS%2C%20potrzebujemy%20pomocy%20z%20naszym%20serwerem%20PHP.%20Firma%3A%20%E2%80%A6%20Strona%20internetowa%3A%20%E2%80%A6

**Krótko:** Proszę ustawić `session.upload_progress.enabled=0` w php.ini, w puli PHP-FPM lub w konfiguracji serwera Apache, nigdy przez `ini_set()` ani `.user.ini`, a następnie zrestartować wszystkie procesy robocze PHP. Środek staje się trwały dopiero wtedy, gdy wartość jest zablokowana przed ponownym włączeniem, obowiązuje w każdym trybie pracy i każdej zainstalowanej wersji PHP oraz jest sprawdzana po aktualizacjach.

## Małe ustawienie o podwójnym działaniu

Rzadko pojedyncze ustawienie PHP zyskało tyle uwagi. Gdy php.net 21 października 2026 opublikował poprawki wobec PHP2Shell, `session.upload_progress.enabled=0` znalazło się na liście środków przejściowych. Dwa dni później pojawiła się wzmianka o CVE-2026-115560, a zalecanym środkiem zaradczym było to samo ustawienie.

Wielu administratorów ustawiło je w tych dniach szybko. Czy działa wszędzie, to inne pytanie. Typowe luki wylicza się szybko: wartość jest ustawiona tylko w konfiguracji CLI, zapomniano o drugiej wersji PHP albo panel hostingu nadpisał plik przy następnym zapisie. Ten artykuł pokazuje, jak wdrożyć środek tak, aby obowiązywał jeszcze za trzy miesiące.

Ważne na początku: wyłączenie nie zastępuje aktualizacji PHP. Według doniesień branżowych samo `session.upload_progress.enabled=0` nie zamyka obu luk PHP2Shell. Czego dokładnie dotyczy CVE-2026-115560, wyjaśnia strona [CVE-2026-115560: wskazówka o postępie uploadu w sesji](https://phpsos.de/pl/php2shell/cve-2026-115560/).

## Co robi ta funkcja i kto jej potrzebuje

Session Upload Progress zapisuje podczas uploadu pliku na bieżąco postęp w sesji, aby aplikacja mogła wyświetlić pasek postępu. W PHP funkcja jest domyślnie włączona. Podręcznik PHP sam zwraca uwagę, że dostarczone przez nadawcę nazwy plików i pól trafiają przy tym bez sprawdzenia do pamięci sesji, i zaleca wyłączenie funkcji, jeśli aplikacja jej nie używa.

Czy Państwa aplikacja jej używa, ustalą Państwo za pomocą wyszukiwania w kodzie tylko do odczytu:

```bash
# Szuka użyć funkcji postępu w kodzie aplikacji
grep -rn --include="*.php" -e "upload_progress" -e "PHP_SESSION_UPLOAD_PROGRESS" /var/www/
```

Jeśli wyszukiwanie niczego nie znajdzie, funkcję można wyłączyć bez odczuwalnych skutków. Jeśli są trafienia, aplikacja traci tylko wskaźnik postępu, a nie upload. Nowoczesne formularze i tak zwykle mierzą postęp w przeglądarce.

## Ustawianie session.upload_progress.enabled we właściwym miejscu

Ustawienie ma według podręcznika PHP tryb `INI_PERDIR`. Oznacza to, że można je ustawić w php.ini, w konfiguracji serwera, w `.htaccess` (tylko mod_php) i w `.user.ini` (tylko FPM i CGI), ale nie w czasie działania. php.net wyraźnie wyklucza `.user.ini` jako miejsce dla tego środka. Poniższa tabela pokazuje sensowne miejsca dla każdego trybu pracy.

| Tryb pracy | Zalecane miejsce | Blokuje nadpisanie? | Następnie zrestartować |
|---|---|---|---|
| PHP-FPM | plik puli z `php_admin_flag` | tak | każdą usługę FPM |
| PHP-FPM | php.ini SAPI FPM | nie, `.user.ini` mogłoby nadpisać | każdą usługę FPM |
| Apache z mod_php | VirtualHost lub konfiguracja serwera z `php_admin_flag` | tak | Apache w całości |
| php-cgi, LiteSpeed, FrankenPHP | php.ini danego środowiska | sprawdzić zależnie od budowy | wszystkie procesy środowiska |
| Obraz Docker | osobny plik w `/usr/local/etc/php/conf.d/` podczas budowania | tak, jeśli nadpisanie nie jest dozwolone | utworzyć kontener od nowa |

Dwa solidne warianty wyglądają tak:

```ini
; PHP-FPM, np. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_flag[session.upload_progress.enabled] = off
```

```apache
# Apache z mod_php, w VirtualHost lub dla całego serwera
<IfModule php_module>
    php_admin_flag session.upload_progress.enabled off
</IfModule>
```

Dodatkowo warto wpisać wartość do php.ini każdego SAPI WWW jako wartość podstawową. Wtedy ustawienie obowiązuje także dla nowych pul, które ktoś założy później. Dlaczego `php_admin_flag` robi różnicę, opisuje artykuł [php_admin_value: blokowanie ustawień przed nadpisaniem](https://phpsos.de/pl/blog/php-admin-value-sperren/).

## Sprawdzanie skuteczności w kontekście WWW

Wiersz poleceń często czyta inny php.ini niż serwer WWW. `php -i` dowodzi więc niewiele. Także `php-fpm8.3 -i` pokazuje tylko wartości z php.ini, a nie wpisy z pul. Wiarygodne jest wyłącznie zapytanie, które faktycznie przechodzi przez pulę.

Postępowanie jest następujące:

1. Zrestartować wszystkie usługi PHP, na przykład `systemctl restart php8.3-fpm` lub Apache przy mod_php. Bez restartu działa dalej stara wartość.
2. Umieścić w katalogu głównym strony krótki plik testowy o losowej nazwie, który wypisuje tylko bieżącą wartość.
3. Wywołać plik raz przez prawdziwą domenę i zanotować wynik.
4. Plik od razu usunąć i powtórzyć krok dla każdej strony i każdej puli.

```php
<?php
// Plik testowy: umieścić tylko na chwilę, potem natychmiast usunąć
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";
```

Oczekiwana jest pusta wartość lub `'0'`. Jeśli widnieje tam `'1'`, Państwa ustawienie w tej puli nie działa. Po aktualizacji PHP należy dodatkowo sprawdzić, czy wszystkie procesy robocze zostały zrestartowane, jak opisano w artykule [Restart PHP-FPM i wszystkich procesów roboczych](https://phpsos.de/pl/php2shell/php-fpm-neustart/).

> **Ważne:**
> Proszę nigdy nie zostawiać plików testowych. Zdradzają wersje i konfigurację, a są ulubionym celem zautomatyzowanych skanów.

## Aby ustawienie pozostało na stałe

Większość nawrotów powstaje nie przez atakujących, lecz przez bieżącą eksploatację. Nowa pula jest kopiowana ze starego szablonu, aktualizacja pakietu tworzy nowy php.ini albo ktoś w panelu hostingu przełącza wersję PHP. Przed takimi nawrotami chronią stałe nawyki.

- **Objąć wszystkie wersje:** na wielu serwerach równolegle działa kilka wersji PHP. Każda ma własne katalogi konfiguracji i wymaga wpisu.
- **Dostosować szablony:** szablony pul, role Ansible, pliki Dockerfile i szablony panelu zawierają wartość, aby nowe strony dziedziczyły ją automatycznie.
- **Korzystać z ustawień panelu:** w panelach hostingu wartość należy wpisać w dodatkowe dyrektywy przewidziane przez panel, w przeciwnym razie następna zmiana nadpisze ręczną pracę.
- **Sprawdzać po aktualizacjach:** sprawdzenie z poprzedniego rozdziału należy do listy kontrolnej każdej aktualizacji PHP.
- **Dokumentować:** zapisać datę, serwer, pule i wynik. To pomaga później wobec zarządu, ubezpieczyciela lub audytorów.

Kto w ogóle nie używa `.user.ini`, może całkowicie wyłączyć wczytywanie takich plików przez `user_ini.filename =` w php.ini. Dotyczy to jednak wszystkich ustawień, które aplikacje tam zapisują. Dlatego krok ten proszę wcześniej przetestować, szczególnie w systemach CMS zapisujących własne pliki `.user.ini`.

Pozostałe środki przejściowe z php.net, na przykład limity dla `post_max_size` i limit pamięci przez cgroup, są zebrane na stronie [Środki doraźne, gdy nie mogą Państwo jeszcze załatać](https://phpsos.de/pl/php2shell/sofortmassnahmen-ohne-patch/). Jak PHP porządkuje swoje poziomy konfiguracji, wyjaśnia artykuł [Plik php.ini wyjaśniony](https://phpsos.de/pl/php/php-ini-erklaert/).

## Jak konkretnie pomaga PHP SOS?

- **Inwentaryzacja:** ustalamy wszystkie wersje PHP, tryby pracy i pule na Państwa serwerach oraz odczytujemy obowiązujące wartości w kontekście WWW.
- **Poprawne ustawienie:** wpisujemy ustawienie z blokadą w pulach i konfiguracji serwera oraz kontrolowanie restartujemy wszystkie procesy robocze.
- **Test działania:** po przestawieniu sprawdzamy formularze uploadu i zarządzanie mediami.
- **Zapobieganie nawrotom:** dostosowujemy szablony, wdrożenia i ustawienia panelu oraz dokumentujemy stan w ramach [utwardzania serwerów](https://phpsos.de/pl/leistungen/server-haertung/).


## Częste pytania

**Dlaczego session.upload_progress.enabled=0 nie działa przez ini_set()?**  
Według podręcznika PHP to ustawienie należy do trybu INI_PERDIR. Nie można go więc w ogóle zmienić w czasie działania przez ini_set(). php.net podaje jako właściwe miejsca php.ini, pulę FPM lub konfigurację serwera, a .user.ini wyraźnie wyklucza.

**Czy uploady plików nadal działają po wyłączeniu?**  
Tak. Wyłączany jest tylko komunikat o postępie, który PHP zapisuje do sesji podczas uploadu. Sam upload przebiega dalej. Dotyczy to wyłącznie aplikacji, które swój pasek postępu budują właśnie na tej funkcji PHP.

**Czy aplikacja może ponownie włączyć tę funkcję?**  
Przez plik .htaccess przy mod_php lub .user.ini przy PHP-FPM jest to zasadniczo możliwe, dopóki wartość nie jest zablokowana. Za pomocą php_admin_flag w puli lub w konfiguracji Apache Państwo temu zapobiegną.

**Czy po następnej aktualizacji PHP muszę przywrócić tę wartość?**  
Nie, nie jest to konieczne. Funkcji nie potrzebuje większość aplikacji, a sam podręcznik PHP radzi ją w takich przypadkach wyłączyć. Po każdej aktualizacji wystarczy sprawdzić, czy wartość nadal obowiązuje.

## Źródła

- [php.net: komunikaty bezpieczeństwa](https://www.php.net/)
- [Podręcznik PHP: konfiguracja sesji](https://www.php.net/manual/en/session.configuration.php)
- [Podręcznik PHP: pliki .user.ini](https://www.php.net/manual/en/configuration.file.per-user.php)
