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 →

Superglobálne premenné: $_GET, $_POST, $_FILES a ďalšie

Superglobálne premenné sú polia, cez ktoré sa kód PHP dostane k údajom požiadavky. Kto vie, ako ich PHP plní a aké hranice platia, píše bezpečnejší kód a lepšie rozumie PHP2Shell.

Stav 4 min čítaniaZnalosti o PHP

Stručne: Superglobálne premenné sú preddefinované polia, ktoré PHP pri každej požiadavke automaticky plní a ktoré sú dostupné všade v kóde. $_GET obsahuje parametre z adresy, $_POST údaje formulárov, $_FILES nahrané súbory, $_COOKIE cookies a $_SERVER údaje o požiadavke a serveri. PHP tieto polia vytvára ešte predtým, než sa spustí kód vašej aplikácie. Zraniteľnosti práve v tomto spracovaní, ako pri PHP2Shell, preto nemožno zachytiť kontrolami v aplikácii.

Čo sú superglobálne premenné?

V PHP platí premenná zvyčajne len vo funkcii, v ktorej bola vytvorená. Superglobálne premenné sú výnimka: sú k dispozícii v každom rozsahu platnosti bez toho, aby sa museli získavať cez global. Príručka PHP ich uvádza deväť.

Pre netechnikov sa to dá opísať takto: superglobálne premenné sú poštová schránka aplikácie. Všetko, čo návštevník pošle, tam pristane skôr, než to aplikácia prečíta. A všetko v schránke pochádza potenciálne od cudzieho.

Superglobálne premenné v prehľade

Superglobálna premenná Obsah Pôvod
$_GET parametre z adresy (query string) klient
$_POST polia formulára požiadavky POST klient
$_FILES údaje o nahraných súboroch klient, spracované PHP
$_COOKIE cookies poslané prehliadačom klient
$_REQUEST zmes z GET, POST a prípadne cookies klient
$_SERVER hlavičky požiadavky, metóda, cesty, údaje o serveri webový server a klient zmiešane
$_ENV premenné prostredia server
$_SESSION údaje aktuálnej relácie úložisko servera
$GLOBALS všetky globálne premenné skript

Obzvlášť zákerné je $_SERVER. Podľa príručky vytvára PHP pre každú hlavičku požiadavky záznam začínajúci HTTP_, napríklad HTTP_USER_AGENT. Tieto hodnoty nastavuje sám klient. Aj SERVER_NAME môže podľa príručky obsahovať názov hostiteľa dodaný klientom a nie je spoľahlivý pre bezpečnostné rozhodnutia.

Ako PHP superglobálne premenné plní

Skôr než sa vykoná prvý znak vášho skriptu, PHP už pracovalo. Číta adresu, hlavičky a obsah požiadavky, rozkladá ich a výsledky ukladá do polí. Tento krok riadi niekoľko nastavení:

  1. variables_order (štandard EGPCS) určuje, ktoré superglobálne premenné sa vôbec vytvoria: Environment, GET, POST, Cookie, Server.
  2. request_order (štandard prázdne) určuje, z čoho sa tvorí $_REQUEST. Ak je prázdne, platí variables_order. Dodávané súbory php.ini vynechávajú podľa príručky cookies z bezpečnostných dôvodov.
  3. max_input_vars (štandard 1000) a max_input_nesting_level (štandard 64) obmedzujú počet a vnorenie vstupných premenných.
  4. post_max_size (štandard 8M) obmedzuje obsah požiadavky. Ak je požiadavka väčšia, zostávajú $_POST a $_FILES prázdne.
  5. enable_post_data_reading (štandard zapnuté) riadi, či PHP obsah požiadaviek POST vôbec automaticky vyhodnocuje.

Ak je enable_post_data_reading vypnuté, aplikácia číta surový obsah sama cez php://input. Od PHP 8.4.0 existuje navyše request_parse_body(), ktoré vyhodnocuje údaje formulárov a nahrávania aj pre iné metódy než POST a umožňuje vlastné limity. Ako presne prebieha časť s nahrávaním, vysvetľuje stránka Ako PHP spracúva nahrávanie súborov.

Bezpečne zaobchádzať s údajmi požiadavky

Zásada je jednoduchá: každá hodnota z $_GET, $_POST, $_COOKIE, $_FILES a záznamov HTTP_ v $_SERVER je cudzí vstup. Pri prijatí sa kontroluje a pri výstupe sa vhodne maskuje.

<?php
declare(strict_types=1);

// Očakáva sa celé číslo: kontrolovať namiesto slepého prevodu
$seite = filter_var($_GET['seite'] ?? '1', FILTER_VALIDATE_INT, [
    'options' => ['min_range' => 1, 'max_range' => 500],
]);
if ($seite === false) {
    http_response_code(400);
    exit('Ungültige Seitenzahl');
}

// Povoliť len dovolené hodnoty
$sortierung = in_array($_GET['sort'] ?? '', ['name', 'datum'], true)
    ? $_GET['sort']
    : 'datum';

// Výstup vždy maskovať
echo htmlspecialchars($_POST['kommentar'] ?? '', ENT_QUOTES, 'UTF-8');

Častým kameňom úrazu sú údaje o pôvode požiadavky. Ak pred webovým serverom stojí reverzný proxy, load balancer alebo CDN, obsahuje $_SERVER['REMOTE_ADDR'] adresu tohto sprostredkovateľa, nie adresu návštevníka. Skutočná adresa je potom v hlavičke ako X-Forwarded-For, ktorú však môže nastaviť každý klient sám. Aplikácia smie takéto hlavičky vyhodnocovať len vtedy, ak požiadavka preukázateľne pochádza z vlastného, známeho proxy. Inak sa blokovania podľa adresy IP alebo protokoly dajú ľahko oklamať. Podobne platí pre HTTPS: ak sa šifrovanie končí na proxy, aplikácia musí výslovne vedieť, že pôvodné spojenie bolo šifrované.

Ďalšie vzory validácie a filtrovania ukazuje príspevok Validácia a filtrovanie vstupov v PHP. Pre údaje relácie v $_SESSION platia vlastné pravidlá; sú na stránke Relácie a cookies v PHP.

Superglobálne premenné a PHP2Shell: čo sa deje pred vaším kódom

Tu je súvis s aktuálnou situáciou. CVE-2026-109618 opisuje, že stav Out-of-Memory môže prerušiť PHP vo chvíli, keď sú údaje požiadavky inicializované len sčasti; pri upratovaní požiadavky sa potom môžu neplatné údaje spracovať ako platné. Pri CVE-2026-109619 môže vnútorný stav požiadavky po uvoľnení pamäte zostať zachovaný a môže ho použiť neskoršia požiadavka v tom istom workeri.

Obe zraniteľnosti teda ležia v spracovaní, ktoré PHP samo vykonáva okolo požiadavky, nie v kóde aplikácie. Tím PHP hodnotí riziko pri mod_php ako najvyššie; tam bol exploit predvedený ešte predtým, než vôbec beží kód aplikácie. Žiadne filter_var() ani kontrola v aplikácii tomu nezabráni.

Konajte hneď

Povinná je aktualizácia na PHP 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35 a reštart všetkých procesov PHP. Prechodné opatrenia z php.net, napríklad užšie limity pre post_max_size, nie sú úplnou ochranou.

Ako konkrétne pomáha PHP SOS?

  • Kontrolujeme účinné limity pre údaje požiadavky pre každý web a nastavujeme ich podľa aplikácie.
  • Nasadzujeme aktualizáciu PHP, reštartujeme všetky workery a stav záplat dokladáme v rámci našej služby záplatovania PHP.
  • Vlastné vývoje kontrolujeme na to, či hodnoty zo superglobálnych premenných nedostávajú nekontrolované do databázy, súborového systému alebo výstupu.
  • Zálohujeme logy webového servera od 20. 10. 2026, aby bolo neskoršie vyhodnotenie možné.

Časté otázky

Koľko superglobálnych premenných existuje v PHP?

Príručka PHP uvádza deväť: $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST a $_ENV. Sú dostupné v každom rozsahu platnosti, aj vo funkciách a metódach.

Sú hodnoty v $_SERVER dôveryhodné?

Len sčasti. Záznamy začínajúce HTTP_ pochádzajú z hlavičiek požiadavky klienta. Príručka varuje napríklad, že SERVER_NAME môže odrážať názov hostiteľa dodaný klientom a nie je spoľahlivý pre bezpečnostné rozhodnutia.

Prečo je $_POST niekedy prázdne, hoci bol formulár odoslaný?

Najčastejšou príčinou je požiadavka väčšia než post_max_size. Potom zostávajú $_POST a $_FILES podľa príručky prázdne. Rovnaký následok má aj vypnuté nastavenie enable_post_data_reading.

Mal by sa používať $_REQUEST?

Radšej nie. $_REQUEST mieša údaje z rôznych zdrojov a ktorý zdroj vyhrá, závisí od request_order a variables_order. Hodnoty čítajte cielene z $_GET alebo $_POST.

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