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:
- Prehliadač pošle cookie s názvom relácie, štandardne
PHPSESSID. session_start()prečíta ID a odovzdá ho obslužnému programu úložiska, štandardnefiles.- Obslužný program načíta uložené údaje, PHP ich pomocou
serialize_handlerprevedie späť a naplní$_SESSION. - Skript číta a mení
$_SESSIONako bežné pole. - Na konci požiadavky PHP údaje zapíše späť. Pri
session.lazy_write(štandard: zapnuté) len vtedy, ak sa zmenili.
<?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. 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
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é.
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, s rovnakou nápravou do ďalšieho riadneho bugfix vydania.
; 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.
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).
- 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.