# Relácie a cookies v PHP

> Ako fungujú relácie a cookies v PHP: ID relácie, ukladanie, štandardné hodnoty php.ini, priebeh nahrávania a prechodné opatrenie proti PHP2Shell.

Zdroj: https://phpsos.de/sk/php/sessions-und-cookies/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**Stručne:** HTTP si medzi dvoma požiadavkami nič nepamätá. Relácia PHP to rieši: PHP pridelí náhodné ID relácie, pošle ho prehliadaču ako cookie a súvisiace údaje ukladá na server, štandardne ako súbor. Pri každej ďalšej požiadavke načíta `session_start()` údaje podľa ID. K reláciám PHP patrí aj funkcia `session.upload_progress`, ktorú php.net odporúča kvôli PHP2Shell dočasne vypnúť na strane servera.

## Prečo webové aplikácie potrebujú relácie

Každá požiadavka na webový server stojí sama za seba. Bez doplnkového mechanizmu by obchod pri kliknutí na „Košík“ už nevedel, kto tam práve niečo vložil, a administrátorská oblasť by musela pri každom kliknutí pýtať heslo. Relácie spájajú jednotlivé požiadavky do sedenia.

Pre rozhodovateľov to znamená: ID relácie je po prihlásení také cenné ako používateľské meno a heslo dokopy. Pre správcov to znamená: kde a ako leží údaje relácie, je bezpečnostná otázka, najmä na serveroch s viacerými webmi.

## Čo sa deje pri session_start()

Priebeh je pri každej požiadavke rovnaký a dá sa opísať v piatich krokoch:

1. Prehliadač pošle cookie s názvom relácie, štandardne `PHPSESSID`.
2. `session_start()` prečíta ID a odovzdá ho obslužnému programu úložiska, štandardne `files`.
3. Obslužný program načíta uložené údaje, PHP ich pomocou `serialize_handler` prevedie späť a naplní `$_SESSION`.
4. Skript číta a mení `$_SESSION` ako bežné pole.
5. Na konci požiadavky PHP údaje zapíše späť. Pri `session.lazy_write` (štandard: zapnuté) len vtedy, ak sa zmenili.

```php
<?php
session_start();

$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];
```

Ak ešte neexistuje relácia, PHP vytvorí nové ID a nastaví cookie. Ak je aktívne `session.use_strict_mode`, PHP odmietne ID zadané prehliadačom, ak je neznáme, a vytvorí nové. Príručka PHP označuje toto nastavenie za nevyhnutné pre základnú bezpečnosť.

## Štandardné hodnoty, ktoré by ste mali poznať

Nasledujúce hodnoty platia podľa príručky PHP, ak nie je nakonfigurované nič iné. Mnohé distribúcie a poskytovatelia hostingu nastavujú vlastné hodnoty, preto vždy rozhoduje skutočne účinná konfigurácia.

| Nastavenie | Štandard | Význam |
|---|---|---|
| `session.save_handler` | `files` | miesto uloženia údajov, možný aj Redis alebo databáza |
| `session.name` | `PHPSESSID` | názov cookie |
| `session.serialize_handler` | `php` | formát uložených údajov |
| `session.use_strict_mode` | `0` | neznáme ID sa preberajú |
| `session.use_only_cookies` | `1` | žiadne ID relácie v adrese |
| `session.cookie_httponly` | `0` | JavaScript môže cookie čítať |
| `session.cookie_secure` | `0` | cookie aj cez nešifrované HTTP |
| `session.cookie_samesite` | prázdne | žiadny atribút SameSite |
| `session.gc_maxlifetime` | `1440` | sekundy do možného upratania |
| `session.gc_probability` / `gc_divisor` | `1` / `100` | upratovanie približne pri každom stom štarte |
| `session.upload_progress.enabled` | `1` | priebeh nahrávania sa zapisuje do relácie |

Hodnoty pre `cookie_httponly`, `cookie_secure` a `use_strict_mode` teda nie sú z výroby nastavené na bezpečnosť. Ako ich správne nastaviť, opisuje príručka [Zabezpečenie relácií v PHP](https://phpsos.de/sk/ratgeber/session-sicherheit-php/). Nastavenia `session.sid_length` a `session.sid_bits_per_character` sú od PHP 8.4.0 označené ako zastarané.

## Nastavovanie cookies priamo

Okrem cookie relácie môže aplikácia nastavovať aj vlastné cookies. Od PHP 7.3.0 na to `setcookie()` prijíma pole volieb, vrátane `samesite`. Od PHP 8.5.0 pribudla navyše voľba `partitioned`.

```php
<?php
setcookie('sprache', 'de', [
    'expires'  => time() + 60 * 60 * 24 * 30,
    'path'     => '/',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);
```

Podľa príručky musí byť pri `samesite` rovnom `None` nastavené aj `secure`, inak prehliadač cookie zablokuje. Cookies sú údaje prehliadača: ich obsah sa pri ďalšej požiadavke vráti cez `$_COOKIE` a musí sa kontrolovať ako každý iný vstup. Viac na stránke [Superglobálne premenné](https://phpsos.de/sk/php/superglobals/).

## session.upload_progress: ukazovateľ priebehu nahrávania

PHP môže počas nahrávania súboru zapisovať priebeh do relácie. Formulár na to pošle skryté pole s názvom z `session.upload_progress.name`, štandardne `PHP_SESSION_UPLOAD_PROGRESS`. PHP potom uloží údaje do `$_SESSION` pod kľúčom s predponou `upload_progress_`, s údajmi ako čas začiatku, celková veľkosť a už spracované bajty.

Dôležité pre pochopenie: podľa príručky zapisuje PHP tieto informácie do relácie ešte predtým, než sa vykoná akýkoľvek skript. Funkcia teda pracuje počas spracovania požiadavky, ešte pred kódom aplikácie. Jej nastavenia sú typu `INI_PERDIR` a počas behu sa zmeniť nedajú.

## Relácie a PHP2Shell: prechodné opatrenie

Ako jedno z prechodných opatrení proti zraniteľnostiam PHP2Shell uvádza php.net nastaviť `session.upload_progress.enabled=0` v php.ini, v poole FPM alebo v konfigurácii servera a potom reštartovať všetky workery, výslovne nie cez `ini_set()` ani `.user.ini`. Dňa 23. 10. 2026 pribudlo upozornenie k [CVE-2026-115560](https://phpsos.de/sk/php2shell/cve-2026-115560/), s rovnakou nápravou do ďalšieho riadneho bugfix vydania.

```ini
; pool FPM webu, potom reštartovať všetky workery
php_admin_flag[session.upload_progress.enabled] = off
```

Podľa odborných správ toto nastavenie samo obe zraniteľnosti nezatvára. Povinná zostáva aktualizácia na PHP 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35. Či vaša aplikácia priebeh nahrávania vôbec používa a ako nastavenie nastaviť trvalo, opisuje príspevok [Vypnutie session.upload_progress](https://phpsos.de/sk/blog/session-upload-progress-abschalten/).

## Ako konkrétne pomáha PHP SOS?

- Zisťujeme skutočne účinné nastavenia relácií pre každý web, nielen hodnoty z príkazového riadka.
- Prechodné opatrenia k PHP2Shell nastavujeme pre každý pool, reštartujeme všetky workery a kontrolujeme výsledok.
- Oddeľujeme miesta uloženia relácií a používateľov poolov medzi webmi v rámci [zabezpečenia servera (hardening)](https://phpsos.de/sk/leistungen/server-haertung/).
- Po incidente zrušíme všetky existujúce sedenia, aby ukradnuté ID relácií boli bezcenné.


## Časté otázky

**Aký je rozdiel medzi cookie a reláciou?**  
Cookie je malý dátový záznam, ktorý prehliadač ukladá a posiela pri každej požiadavke. Relácia ukladá skutočné údaje na serveri; v cookie je len náhodný identifikátor, ID relácie.

**Ako dlho žije relácia PHP?**  
Cookie relácie platí štandardne, kým sa prehliadač nezavrie. Údaje na serveri sa smú upratať po session.gc_maxlifetime, štandardne 1440 sekundách bez prístupu. Kedy sa to skutočne stane, závisí od logiky upratovania systému.

**Čo robí session.upload_progress?**  
Funkcia zapisuje počas nahrávania súboru priebeh do relácie, aby ho mohla zobraziť druhá požiadavka. Je štandardne aktívna. Kvôli PHP2Shell php.net odporúča ju dočasne vypnúť na strane servera.

**Stačí session.upload_progress vypnúť cez ini_set()?**  
Nie. Nastavenie sa podľa príručky počas behu aj tak zmeniť nedá a php.net výslovne uvádza ako správne miesta php.ini, pool FPM alebo konfiguráciu servera, nie ini_set() ani .user.ini. Potom reštartovať všetky workery.

## Zdroje

- [Príručka PHP: Konfigurácia relácií](https://www.php.net/manual/de/session.configuration.php)
- [Príručka PHP: Priebeh nahrávania v relácii](https://www.php.net/manual/de/session.upload-progress.php)
- [Príručka PHP: setcookie](https://www.php.net/manual/en/function.setcookie.php)
- [php.net: Bezpečnostné hlásenia](https://www.php.net/)
