# Superglobálne premenné: $_GET, $_POST, $_FILES a ďalšie

> Superglobálne premenné PHP vysvetlené: čo je v $_GET, $_POST, $_FILES, $_SERVER a ďalších, ako ich PHP plní pred vaším kódom a ako bezpečne používať údaje požiadavky.

Zdroj: https://phpsos.de/sk/php/superglobals/  
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:** 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](https://phpsos.de/sk/php/datei-uploads-intern/).

## 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
<?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](https://phpsos.de/sk/blog/eingaben-validieren-php/). Pre údaje relácie v `$_SESSION` platia vlastné pravidlá; sú na stránke [Relácie a cookies v PHP](https://phpsos.de/sk/php/sessions-und-cookies/).

## 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](https://phpsos.de/sk/php2shell/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](https://phpsos.de/sk/leistungen/php-patch-service/).
- 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

- [Príručka PHP: Superglobálne premenné](https://www.php.net/manual/de/language.variables.superglobals.php)
- [Príručka PHP: $_SERVER](https://www.php.net/manual/en/reserved.variables.server.php)
- [Príručka PHP: Direktívy php.ini](https://www.php.net/manual/de/ini.core.php)
- [Príručka PHP: request_parse_body](https://www.php.net/manual/en/function.request-parse-body.php)
