# Superglobals: $_GET, $_POST, $_FILES in druge

> Superglobals PHP razložene: kaj vsebujejo $_GET, $_POST, $_FILES in $_SERVER, kako jih PHP napolni pred vašo kodo in kako varno uporabljate podatke zahteve.

Vir: https://phpsos.de/sl/php/superglobals/  
Stanje: 25.10.2026  
Ponudnik: PHP SOS, Nujna pomoč za PHP in varnost strežnikov. Takojšnja pomoč po WhatsAppu: https://wa.me/491736494914?text=Pozdravljeni%2C%20PHP%20SOS%2C%20potrebujemo%20pomo%C4%8D%20z%20na%C5%A1im%20stre%C5%BEnikom%20PHP.%20Podjetje%3A%20%E2%80%A6%20Spletna%20stran%3A%20%E2%80%A6

**Na kratko:** Superglobals so vnaprej določena polja, ki jih PHP ob vsaki zahtevi samodejno napolni in so na voljo povsod v kodi. `$_GET` vsebuje parametre iz naslova, `$_POST` podatke obrazcev, `$_FILES` naložene datoteke, `$_COOKIE` piškotke in `$_SERVER` podatke o zahtevi in strežniku. PHP ta polja ustvari, preden se zažene koda vaše aplikacije. Zato ranljivosti v prav tej obdelavi, kot pri PHP2Shell, ne more prestreči nobeno preverjanje v aplikaciji.

## Kaj so superglobals?

V PHP spremenljivka običajno velja samo v funkciji, v kateri je bila ustvarjena. Superglobals so izjema: na voljo so v vsakem območju veljavnosti, ne da bi jih bilo treba pridobiti z `global`. Priročnik PHP jih navaja devet.

Za netehnike je to mogoče opisati takole: superglobals so poštni nabiralnik aplikacije. Vse, kar obiskovalec pošlje, pristane tam, preden aplikacija to prebere. In vse v nabiralniku potencialno izvira od tujca.

## Pregled superglobals

| Superglobal | Vsebina | Izvor |
|---|---|---|
| `$_GET` | parametri iz naslova (query string) | odjemalec |
| `$_POST` | polja obrazca zahteve POST | odjemalec |
| `$_FILES` | podatki o naloženih datotekah | odjemalec, pripravljeno s strani PHP |
| `$_COOKIE` | piškotki, ki jih pošlje brskalnik | odjemalec |
| `$_REQUEST` | mešanica GET, POST in po potrebi piškotkov | odjemalec |
| `$_SERVER` | glave zahteve, metoda, poti, podatki strežnika | spletni strežnik in odjemalec skupaj |
| `$_ENV` | spremenljivke okolja | strežnik |
| `$_SESSION` | podatki trenutne seje | pomnilnik strežnika |
| `$GLOBALS` | vse globalne spremenljivke | skripta |

Posebej zahrbten je `$_SERVER`. Po priročniku PHP za vsako glavo zahteve ustvari vnos s `HTTP_` na začetku, na primer `HTTP_USER_AGENT`. Te vrednosti nastavi odjemalec sam. Tudi `SERVER_NAME` lahko po priročniku vsebuje ime gostitelja, ki ga je dobavil odjemalec, in za varnostne odločitve ni zanesljiv.

## Kako PHP napolni superglobals

Preden se izvede prvi znak vaše skripte, je PHP že delal. Prebere naslov, glave in vsebino zahteve, jih razčleni in rezultate odloži v polja. Ta korak urejajo številne nastavitve:

1. **`variables_order`** (privzeto `EGPCS`) določa, katere superglobals se sploh ustvarijo: Environment, GET, POST, Cookie, Server.
2. **`request_order`** (privzeto prazno) določa, iz česa se sestavi `$_REQUEST`. Če je prazno, velja `variables_order`. Priložene datoteke php.ini po priročniku iz varnostnih razlogov piškotke izpustijo.
3. **`max_input_vars`** (privzeto `1000`) in **`max_input_nesting_level`** (privzeto `64`) omejujeta število in gnezdenje vhodnih spremenljivk.
4. **`post_max_size`** (privzeto `8M`) omejuje vsebino zahteve. Če je zahteva večja, ostaneta `$_POST` in `$_FILES` prazna.
5. **`enable_post_data_reading`** (privzeto vklopljeno) določa, ali PHP vsebino zahtev POST sploh samodejno obdela.

Če je `enable_post_data_reading` izklopljen, aplikacija surovo vsebino prebere sama prek `php://input`. Od PHP 8.4.0 obstaja dodatno `request_parse_body()`, ki podatke obrazcev in nalaganj obdela tudi za druge metode kot POST in dopušča lastne mejne vrednosti. Kako natančno poteka del z nalaganji, razlaga stran [Kako PHP obdeluje nalaganje datotek](https://phpsos.de/sl/php/datei-uploads-intern/).

## Varno ravnanje s podatki zahtev

Načelo je preprosto: vsaka vrednost iz `$_GET`, `$_POST`, `$_COOKIE`, `$_FILES` in vnosov `HTTP_` v `$_SERVER` je tuj vnos. Ob sprejemu se preveri, ob izpisu pa ustrezno maskira.

```php
<?php
declare(strict_types=1);

// Pričakovano celo število: preveriti, ne slepo pretvoriti
$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');
}

// Dovoliti samo dovoljene vrednosti
$sortierung = in_array($_GET['sort'] ?? '', ['name', 'datum'], true)
    ? $_GET['sort']
    : 'datum';

// Izpis vedno maskirati
echo htmlspecialchars($_POST['kommentar'] ?? '', ENT_QUOTES, 'UTF-8');
```

Pogosta past so podatki o izvoru zahteve. Če pred spletnim strežnikom stoji reverse proxy, uravnoteževalnik obremenitve ali CDN, `$_SERVER['REMOTE_ADDR']` vsebuje naslov tega posrednika, ne obiskovalca. Pravi naslov je takrat v glavi, kot je `X-Forwarded-For`, ki pa jo lahko vsak odjemalec nastavi sam. Aplikacija sme takšne glave obdelati samo, če zahteva dokazljivo prihaja od lastnega, znanega proxyja. Sicer je blokade po naslovu IP ali protokole lahko zlahka prevarati. Podobno velja za `HTTPS`: če se šifriranje konča na proxyju, mora aplikacija izrecno vedeti, da je bila prvotna povezava šifrirana.

Nadaljnje vzorce za preverjanje in filtriranje kaže prispevek [Preverjanje in filtriranje vnosov v PHP](https://phpsos.de/sl/blog/eingaben-validieren-php/). Za podatke seje v `$_SESSION` veljajo lastna pravila; opisana so na strani [Seje in piškotki v PHP](https://phpsos.de/sl/php/sessions-und-cookies/).

## Superglobals in PHP2Shell: kaj se zgodi pred vašo kodo

Tu je povezava z aktualnim stanjem. [CVE-2026-109618](https://phpsos.de/sl/php2shell/cve-2026-109618/) opisuje, da lahko stanje Out of Memory PHP prekine, medtem ko so podatki zahteve le delno inicializirani; pri čiščenju zahteve se neveljavni podatki nato lahko obravnavajo kot veljavni. Pri CVE-2026-109619 lahko notranje stanje zahteve po sprostitvi pomnilnika ostane in ga uporabi poznejša zahteva v istem workerju.

Obe ranljivosti torej ležita v obdelavi, ki jo PHP sam opravlja okoli zahteve, ne v kodi aplikacije. Ekipa PHP tveganje pri mod_php ocenjuje kot najvišje; tam je bil exploit prikazan, še preden sploh teče koda aplikacije. Tega ne more preprečiti noben `filter_var()` in nobeno preverjanje v aplikaciji.

> **Ukrepajte takoj:**
> Obvezna je posodobitev na PHP 8.5.12, 8.4.27, 8.3.36 ali 8.2.35 in ponovni zagon vseh procesov PHP. Prehodni ukrepi php.net, na primer ožje meje za `post_max_size`, niso popolna zaščita.

## Kako PHP SOS pomaga konkretno?

- Preverimo veljavne mejne vrednosti za podatke zahtev za vsako spletno stran in jih nastavimo glede na aplikacijo.
- Namestimo posodobitev PHP, znova zaženemo vse workerje in stanje popravkov dokažemo v okviru naše [storitve popravljanja PHP](https://phpsos.de/sl/leistungen/php-patch-service/).
- Lasten razvoj preverimo glede tega, ali vrednosti iz superglobals nepreverjene pridejo v podatkovno zbirko, datotečni sistem ali izpis.
- Dnevnike spletnega strežnika zavarujemo od 20. 10. 2026, da je poznejša analiza še mogoča.


## Pogosta vprašanja

**Koliko superglobals obstaja v PHP?**  
Priročnik PHP jih navaja devet: $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST in $_ENV. Na voljo so v vsakem območju veljavnosti, tudi v funkcijah in metodah.

**Ali so vrednosti v $_SERVER vredne zaupanja?**  
Samo deloma. Vnosi, ki se začnejo s HTTP_, izvirajo iz glav zahteve odjemalca. Priročnik na primer opozarja, da SERVER_NAME lahko odraža ime gostitelja, ki ga je dobavil odjemalec, in za varnostne odločitve ni zanesljiv.

**Zakaj je $_POST včasih prazen, čeprav je bil obrazec poslan?**  
Najpogostejši vzrok je zahteva, večja od post_max_size. Takrat po priročniku $_POST in $_FILES ostaneta prazna. Do tega vodi tudi izklopljena nastavitev enable_post_data_reading.

**Ali naj uporabljam $_REQUEST?**  
Raje ne. $_REQUEST meša podatke iz različnih virov, kateri vir zmaga, pa je odvisno od request_order in variables_order. Vrednosti berite ciljno iz $_GET ali $_POST.

## Viri

- [Priročnik PHP: superglobals](https://www.php.net/manual/de/language.variables.superglobals.php)
- [Priročnik PHP: $_SERVER](https://www.php.net/manual/en/reserved.variables.server.php)
- [Priročnik PHP: direktive php.ini](https://www.php.net/manual/de/ini.core.php)
- [Priročnik PHP: request_parse_body](https://www.php.net/manual/en/function.request-parse-body.php)
