Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

Relácie a cookies v PHP

Relácie robia z bezstavového HTTP prihlásenie, ktoré vydrží cez viaceré stránky. Tu je, ako to PHP rieši interne, aké štandardné hodnoty platia a čo má session.upload_progress spoločné s PHP2Shell.

Stav 4 min čítaniaZnalosti o PHP

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
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.

Zdroje

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc