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:
variables_order(privzetoEGPCS) določa, katere superglobals se sploh ustvarijo: Environment, GET, POST, Cookie, Server.request_order(privzeto prazno) določa, iz česa se sestavi$_REQUEST. Če je prazno, veljavariables_order. Priložene datoteke php.ini po priročniku iz varnostnih razlogov piškotke izpustijo.max_input_vars(privzeto1000) inmax_input_nesting_level(privzeto64) omejujeta število in gnezdenje vhodnih spremenljivk.post_max_size(privzeto8M) omejuje vsebino zahteve. Če je zahteva večja, ostaneta$_POSTin$_FILESprazna.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.
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
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. Za podatke seje v $_SESSION veljajo lastna pravila; opisana so na strani Seje in piškotki v PHP.
Superglobals in PHP2Shell: kaj se zgodi pred vašo kodo
Tu je povezava z aktualnim stanjem. 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.
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.
- 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.