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í:
variables_order(štandardEGPCS) určuje, ktoré superglobálne premenné sa vôbec vytvoria: Environment, GET, POST, Cookie, Server.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.max_input_vars(štandard1000) amax_input_nesting_level(štandard64) obmedzujú počet a vnorenie vstupných premenných.post_max_size(štandard8M) obmedzuje obsah požiadavky. Ak je požiadavka väčšia, zostávajú$_POSTa$_FILESprázdne.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.
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.