Lühidalt: Superglobaalid on eelnevalt määratletud massiivid, mida PHP igal päringul automaatselt täidab ja mis on koodis kõikjal kättesaadavad. $_GET sisaldab aadressi parameetreid, $_POST vormiandmeid, $_FILES üleslaaditud faile, $_COOKIE küpsiseid ja $_SERVER andmeid päringu ja serveri kohta. PHP loob need massiivid enne, kui teie rakenduse kood käivitub. Seetõttu ei saa just selles töötluses olevaid auke, nagu PHP2Shelli puhul, rakenduses olevate kontrollidega kinni püüda.
Mis on superglobaalid?
PHP-s kehtib muutuja tavaliselt ainult funktsioonis, kus see loodi. Superglobaalid on erand: need on kättesaadavad igas kehtivuspiirkonnas, ilma et neid oleks vaja global abil tuua. PHP käsiraamat nimetab neid üheksa.
Mitte-tehnikutele saab seda kirjeldada nii: superglobaalid on rakenduse postkast. Kõik, mida külastaja saadab, jõuab sinna enne, kui rakendus seda loeb. Ja kõik postkastis olev pärineb potentsiaalselt võõralt.
Superglobaalid ülevaatlikult
| Superglobaal | Sisu | Päritolu |
|---|---|---|
$_GET |
aadressi parameetrid (query string) | klient |
$_POST |
POST-päringu vormiväljad | klient |
$_FILES |
andmed üleslaaditud failide kohta | klient, PHP poolt ette valmistatud |
$_COOKIE |
brauseri kaasa saadetud küpsised | klient |
$_REQUEST |
GET-i, POST-i ja vajadusel küpsiste segu | klient |
$_SERVER |
päringupäised, meetod, teed, serveri andmed | veebiserver ja klient segamini |
$_ENV |
keskkonnamuutujad | server |
$_SESSION |
praeguse sessiooni andmed | serveri mälu |
$GLOBALS |
kõik globaalsed muutujad | skript |
Eriti salakaval on $_SERVER. Käsiraamatu järgi loob PHP iga päringupäise jaoks kirje, mille algus on HTTP_, näiteks HTTP_USER_AGENT. Need väärtused seab klient ise. Ka SERVER_NAME võib käsiraamatu järgi sisaldada kliendi antud hostinime ja ei ole turvaotsuste jaoks usaldusväärne.
Kuidas PHP superglobaale täidab
Enne kui teie skripti esimene märk täidetakse, on PHP juba töötanud. See loeb aadressi, päised ja päringu sisu, jaotab need ja paneb tulemused massiividesse. Seda sammu juhivad mitu sätet:
variables_order(vaikeväärtusEGPCS) määrab, millised superglobaalid üldse luuakse: Environment, GET, POST, Cookie, Server.request_order(vaikeväärtus tühi) määrab, millest$_REQUESTmoodustatakse. Kui see on tühi, kehtibvariables_order. Kaasa antud php.ini failid jätavad küpsised käsiraamatu järgi turvakaalutlustel välja.max_input_vars(vaikeväärtus1000) jamax_input_nesting_level(vaikeväärtus64) piiravad sisendmuutujate arvu ja pesastust.post_max_size(vaikeväärtus8M) piirab päringu sisu. Kui päring on suurem, jäävad$_POSTja$_FILEStühjaks.enable_post_data_reading(vaikeväärtus sees) juhib, kas PHP POST-päringute sisu üldse automaatselt töötleb.
Kui enable_post_data_reading on välja lülitatud, loeb rakendus toore sisu ise php://input kaudu. Alates PHP 8.4.0-st on lisaks request_parse_body(), mis töötleb vorme ja üleslaaditud andmeid ka muude meetodite kui POST puhul ning lubab oma piirväärtusi. Kuidas üleslaadimise osa üksikasjades toimub, selgitab leht Kuidas PHP failide üleslaadimist töötleb.
Päringuandmetega turvaliselt ümber käia
Põhimõte on lihtne: iga väärtus $_GET, $_POST, $_COOKIE, $_FILES ja $_SERVER kirjetest HTTP_ on võõras sisend. See kontrollitakse vastuvõtul ja maskeeritakse väljundis sobivalt.
<?php
declare(strict_types=1);
// Oodatakse täisarvu: kontrolli, mitte pimesi teisenda
$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');
}
// Luba ainult lubatud väärtused
$sortierung = in_array($_GET['sort'] ?? '', ['name', 'datum'], true)
? $_GET['sort']
: 'datum';
// Väljund alati maskeerida
echo htmlspecialchars($_POST['kommentar'] ?? '', ENT_QUOTES, 'UTF-8');
Sage komistuskivi on andmed päringu päritolu kohta. Kui veebiserveri ees on pöördpuhverserver, koormusjaotur või CDN, sisaldab $_SERVER['REMOTE_ADDR'] selle vahendaja aadressi, mitte külastaja oma. Tegelik aadress on siis päises nagu X-Forwarded-For, mille aga iga klient saab ise seada. Rakendus tohib selliseid päiseid töödelda ainult siis, kui päring tuleb tõendatult oma, tuntud puhverserverilt. Muidu saab IP-aadressi põhiseid blokeeringuid või logisid hõlpsasti petta. Sarnast kehtib HTTPS kohta: kui krüpteerimine lõpeb puhverserveris, peab rakendus selgesõnaliselt teadma, et algne ühendus oli krüpteeritud.
Teisi valideerimise ja filtreerimise mustreid näitab artikkel Sisendite valideerimine ja filtreerimine PHP-s. Sessiooniandmete jaoks $_SESSION kehtivad omad reeglid; need on lehel Sessioonid ja küpsised PHP-s.
Superglobaalid ja PHP2Shell: mis toimub enne teie koodi
Siin asub seos praeguse olukorraga. CVE-2026-109618 kirjeldab, et Out-of-Memory olukord võib PHP töö katkestada ajal, mil päringuandmed on alles osaliselt lähtestatud; päringu koristamisel võidakse kehtetuid andmeid siis käsitleda kehtivatena. CVE-2026-109619 puhul võib päringu sisemine olek pärast mälu vabastamist alles jääda ja seda võib kasutada hilisem päring samas workeris.
Mõlemad augud asuvad seega töötluses, mida PHP ise päringu ümber teeb, mitte rakenduse koodis. PHP meeskond hindab riski mod_php puhul kõige suuremaks; seal näidati ekspluateerimist enne, kui rakenduse kood üldse käivitub. Ükski filter_var() ega rakenduses olev kontroll ei saa seda takistada.
Kohustuslik on uuendus versioonile PHP 8.5.12, 8.4.27, 8.3.36 või 8.2.35 ja kõigi PHP protsesside taaskäivitus. php.net-i ajutised meetmed, näiteks kitsamad piirid post_max_size jaoks, ei ole täielik kaitse.
Kuidas PHP SOS konkreetselt aitab?
- Kontrollime veebisaidi kohta päringuandmete mõjusaid piirväärtusi ja seame need rakendusega sobivaks.
- Paigaldame PHP uuenduse, käivitame kõik workerid uuesti ja tõendame paikaseisu meie PHP paigateenuse raames.
- Kontrollime oma arendusi selle suhtes, kas superglobaalide väärtused jõuavad kontrollimata andmebaasi, failisüsteemi või väljundisse.
- Kindlustame veebiserveri logid alates 20.10.2026, et hilisem hindamine jääks võimalikuks.
Korduma kippuvad küsimused
Mitu superglobaali PHP-s on?
PHP käsiraamat nimetab üheksa: $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST ja $_ENV. Need on kättesaadavad igas kehtivuspiirkonnas, ka funktsioonides ja meetodites.
Kas $_SERVER väärtused on usaldusväärsed?
Ainult osaliselt. Kirjed, mis algavad HTTP_, pärinevad kliendi päringupäistest. Käsiraamat hoiatab näiteks, et SERVER_NAME võib kajastada kliendi antud hostinime ega ole turvaotsuste jaoks usaldusväärne.
Miks $_POST on vahel tühi, kuigi vorm saadeti?
Kõige sagedasem põhjus on päring, mis on suurem kui post_max_size. Siis jäävad $_POST ja $_FILES käsiraamatu järgi tühjaks. Sama tulemuse annab ka väljalülitatud säte enable_post_data_reading.
Kas $_REQUEST'i peaks kasutama?
Parem mitte. $_REQUEST segab andmeid erinevatest allikatest ja milline allikas võidab, sõltub sätetest request_order ja variables_order. Lugege väärtusi sihipäraselt kas $_GET või $_POST kaudu.