Ukratko: Superglobali su unaprijed definirana polja koja PHP automatski popunjava pri svakom zahtjevu i koja su dostupna posvuda u kodu. $_GET sadrži parametre iz adrese, $_POST podatke obrasca, $_FILES učitane datoteke, $_COOKIE kolačiće, a $_SERVER podatke o zahtjevu i poslužitelju. PHP ta polja stvara prije nego što se pokrene kod Vaše aplikacije. Zato ranjivosti u upravo toj obradi, kao kod PHP2Shella, provjere u aplikaciji ne mogu presresti.
Što su superglobali?
U PHP-u varijabla normalno vrijedi samo u funkciji u kojoj je stvorena. Superglobali su iznimka: dostupni su u svakom dosegu, a da ih se ne mora dohvaćati pomoću global. PHP priručnik navodi devet takvih.
Za netehničke osobe to se može opisati ovako: superglobali su poštanski sandučić aplikacije. Sve što posjetitelj pošalje, tamo završava prije nego što aplikacija to pročita. A sve u sandučiću potencijalno potječe od stranca.
Superglobali ukratko
| Superglobal | Sadržaj | Podrijetlo |
|---|---|---|
$_GET |
parametri iz adrese (query string) | klijent |
$_POST |
polja obrasca POST zahtjeva | klijent |
$_FILES |
podaci o učitanim datotekama | klijent, obradio PHP |
$_COOKIE |
kolačići koje šalje preglednik | klijent |
$_REQUEST |
mješavina GET-a, POST-a i po potrebi kolačića | klijent |
$_SERVER |
zaglavlja zahtjeva, metoda, putanje, podaci o poslužitelju | web-poslužitelj i klijent pomiješano |
$_ENV |
varijable okoline | poslužitelj |
$_SESSION |
podaci trenutne sesije | memorija poslužitelja |
$GLOBALS |
sve globalne varijable | skripta |
Osobito je podmukao $_SERVER. Prema priručniku PHP za svako zaglavlje zahtjeva stvara unos koji počinje s HTTP_, na primjer HTTP_USER_AGENT. Te vrijednosti postavlja sam klijent. I SERVER_NAME prema priručniku može sadržavati naziv hosta koji je isporučio klijent i nije pouzdan za sigurnosne odluke.
Kako PHP popunjava superglobale
Prije nego što se izvrši prvi znak Vaše skripte, PHP je već radio. Čita adresu, zaglavlja i sadržaj zahtjeva, rastavlja ih i rezultate sprema u polja. Taj korak upravlja nekoliko postavki:
variables_order(zadanoEGPCS) određuje koji se superglobali uopće stvaraju: Environment, GET, POST, Cookie, Server.request_order(zadano prazno) određuje od čega se gradi$_REQUEST. Ako je prazno, vrijedivariables_order. Isporučene php.ini datoteke prema priručniku iz sigurnosnih razloga izostavljaju kolačiće.max_input_vars(zadano1000) imax_input_nesting_level(zadano64) ograničavaju broj i ugniježđenost ulaznih varijabli.post_max_size(zadano8M) ograničava sadržaj zahtjeva. Ako je zahtjev veći,$_POSTi$_FILESostaju prazni.enable_post_data_reading(zadano uključeno) određuje hoće li PHP sadržaj POST zahtjeva uopće automatski obrađivati.
Ako je enable_post_data_reading isključen, aplikacija sirovi sadržaj sama čita putem php://input. Od PHP-a 8.4.0 postoji dodatno request_parse_body(), koji podatke obrazaca i uploada obrađuje i za metode koje nisu POST te dopušta vlastite granične vrijednosti. Kako detaljno teče dio s uploadom, objašnjava stranica Kako PHP obrađuje uploade datoteka.
Sigurno postupati s podacima zahtjeva
Načelo je jednostavno: svaka vrijednost iz $_GET, $_POST, $_COOKIE, $_FILES i HTTP_ unosa iz $_SERVER tuđ je unos. Provjerava se pri prihvaćanju, a pri ispisu odgovarajuće escapea.
<?php
declare(strict_types=1);
// Očekuje se cijeli broj: provjeriti umjesto slijepo pretvarati
$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');
}
// Dopustiti samo dopuštene vrijednosti
$sortierung = in_array($_GET['sort'] ?? '', ['name', 'datum'], true)
? $_GET['sort']
: 'datum';
// Ispis uvijek escapeati
echo htmlspecialchars($_POST['kommentar'] ?? '', ENT_QUOTES, 'UTF-8');
Čest je kamen spoticanja podatak o podrijetlu zahtjeva. Ako ispred web-poslužitelja stoji reverse proxy, load balancer ili CDN, $_SERVER['REMOTE_ADDR'] sadrži adresu tog posrednika, a ne posjetitelja. Prava adresa tada stoji u zaglavlju poput X-Forwarded-For, koje ipak svaki klijent može postaviti sam. Aplikacija smije obrađivati takva zaglavlja samo ako zahtjev dokazano dolazi s vlastitog, poznatog proxyja. Inače se blokade prema IP adresi ili zapisnici lako mogu zavarati. Slično vrijedi za HTTPS: ako šifriranje završava na proxyju, aplikacija mora izričito znati da je izvorna veza bila šifrirana.
Dodatne uzorke za validaciju i filtriranje prikazuje članak Validacija i filtriranje unosa u PHP-u. Za podatke sesije u $_SESSION vrijede vlastita pravila; nalaze se na stranici Sesije i kolačići u PHP-u.
Superglobali i PHP2Shell: što se događa prije Vašeg koda
Ovdje je veza s aktualnim stanjem. CVE-2026-109618 opisuje da stanje nedostatka memorije može prekinuti PHP dok su podaci zahtjeva tek djelomično inicijalizirani; pri čišćenju zahtjeva nevaljani se podaci tada mogu tretirati kao valjani. Kod CVE-2026-109619 unutarnje stanje zahtjeva može ostati sačuvano nakon oslobađanja memorije i iskoristiti ga kasniji zahtjev u istom workeru.
Obje ranjivosti dakle leže u obradi koju PHP sam obavlja oko zahtjeva, a ne u kodu aplikacije. PHP tim rizik kod mod_php-a ocjenjuje najvišim; tamo je pokazan exploit prije nego što se uopće izvrši kod aplikacije. Nikakav filter_var() ni provjera u aplikaciji to ne mogu spriječiti.
Obvezno je ažuriranje na PHP 8.5.12, 8.4.27, 8.3.36 ili 8.2.35 i ponovno pokretanje svih PHP procesa. Prijelazne mjere php.net-a, na primjer uže granice za post_max_size, nisu potpuna zaštita.
Kako PHP SOS konkretno pomaže?
- Provjeravamo djelotvorne granične vrijednosti za podatke zahtjeva po web-stranici i postavljamo ih u skladu s aplikacijom.
- Instaliramo PHP ažuriranje, ponovno pokrećemo sve workere i dokazujemo razinu zakrpa u okviru naše PHP Patch usluge.
- Vlastiti razvoj provjeravamo dospijevaju li vrijednosti iz superglobala neprovjereno u bazu podataka, datotečni sustav ili ispis.
- Zapisnike web-poslužitelja osiguravamo od 20. 10. 2026. kako bi kasnija analiza ostala moguća.
Česta pitanja
Koliko superglobala postoji u PHP-u?
PHP priručnik navodi devet: $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST i $_ENV. Dostupni su u svakom dosegu, i u funkcijama i metodama.
Jesu li vrijednosti u $_SERVER pouzdane?
Samo djelomično. Unosi koji počinju s HTTP_ potječu iz zaglavlja zahtjeva klijenta. Priručnik upozorava, na primjer, da SERVER_NAME može odražavati naziv hosta koji je isporučio klijent i da nije pouzdan za sigurnosne odluke.
Zašto je $_POST ponekad prazan iako je obrazac poslan?
Najčešći uzrok je zahtjev veći od post_max_size. Tada $_POST i $_FILES prema priručniku ostaju prazni. Do toga dovodi i isključena postavka enable_post_data_reading.
Treba li koristiti $_REQUEST?
Bolje ne. $_REQUEST miješa podatke iz različitih izvora, a koji izvor pobjeđuje, ovisi o request_order i variables_order. Vrijednosti čitajte ciljano iz $_GET ili $_POST.