Īsi: Superglobālie mainīgie ir iepriekš definēti masīvi, ko PHP katrā pieprasījumā aizpilda automātiski un kas ir pieejami visur kodā. $_GET satur parametrus no adreses, $_POST veidlapu datus, $_FILES augšupielādētos failus, $_COOKIE sīkdatnes un $_SERVER ziņas par pieprasījumu un serveri. PHP šos masīvus izveido, pirms sākas jūsu lietojumprogrammas kods. Tāpēc ievainojamības tieši šajā apstrādē, kā PHP2Shell gadījumā, nevar notvert ar pārbaudēm lietojumprogrammā.
Kas ir superglobālie mainīgie?
PHP mainīgais parasti ir spēkā tikai funkcijā, kurā tas izveidots. Superglobālie mainīgie ir izņēmums: tie ir pieejami katrā darbības apgabalā, nav jāņem ar global. PHP rokasgrāmata min deviņus no tiem.
Netehniķiem to var aprakstīt šādi: superglobālie mainīgie ir lietojumprogrammas pastkastīte. Viss, ko apmeklētājs sūta, nonāk tur, pirms lietojumprogramma to nolasa. Un viss pastkastītē potenciāli nāk no svešinieka.
Superglobālie mainīgie pārskatā
| Superglobālais | Saturs | Izcelsme |
|---|---|---|
$_GET |
parametri no adreses (query string) | klients |
$_POST |
POST pieprasījuma veidlapas lauki | klients |
$_FILES |
ziņas par augšupielādētajiem failiem | klients, PHP sagatavots |
$_COOKIE |
pārlūkprogrammas līdzi nosūtītās sīkdatnes | klients |
$_REQUEST |
GET, POST un, iespējams, sīkdatņu maisījums | klients |
$_SERVER |
pieprasījuma galvenes, metode, ceļi, servera ziņas | tīmekļa serveris un klients jaukti |
$_ENV |
vides mainīgie | serveris |
$_SESSION |
pašreizējās sesijas dati | servera atmiņa |
$GLOBALS |
visi globālie mainīgie | skripts |
Īpaši salts ir $_SERVER. Saskaņā ar rokasgrāmatu PHP katrai pieprasījuma galvenei izveido ierakstu ar HTTP_ sākumā, piemēram, HTTP_USER_AGENT. Šīs vērtības iestata pats klients. Arī SERVER_NAME saskaņā ar rokasgrāmatu var saturēt klienta piegādāto saimniekdatora nosaukumu un drošības lēmumiem nav uzticams.
Kā PHP aizpilda superglobālos mainīgos
Pirms tiek izpildīta jūsu skripta pirmā rakstzīme, PHP jau ir strādājis. Tas nolasa adresi, galvenes un pieprasījuma saturu, sadala tos un rezultātus ievieto masīvos. Šo soli vada vairāki iestatījumi:
variables_order(noklusējumsEGPCS) nosaka, kuri superglobālie mainīgie vispār tiek izveidoti: Environment, GET, POST, Cookie, Server.request_order(noklusējums tukšs) nosaka, no kā tiek veidots$_REQUEST. Ja tas ir tukšs, ir spēkāvariables_order. Komplektā iekļautie php.ini faili sīkdatnes saskaņā ar rokasgrāmatu drošības nolūkos izlaiž.max_input_vars(noklusējums1000) unmax_input_nesting_level(noklusējums64) ierobežo ievades mainīgo skaitu un ligzdošanu.post_max_size(noklusējums8M) ierobežo pieprasījuma saturu. Ja pieprasījums ir lielāks,$_POSTun$_FILESpaliek tukši.enable_post_data_reading(noklusējums ieslēgts) nosaka, vai PHP POST pieprasījumu saturu vispār apstrādā automātiski.
Ja enable_post_data_reading ir izslēgts, lietojumprogramma neapstrādāto saturu nolasa pati caur php://input. Kopš PHP 8.4.0 papildus ir request_parse_body(), kas veidlapu un augšupielādes datus apstrādā arī citām metodēm, ne tikai POST, un atļauj savas robežvērtības. Kā augšupielādes daļa norit detalizēti, izskaidro lapa Kā PHP apstrādā failu augšupielādes.
Droša rīcība ar pieprasījuma datiem
Pamatprincips ir vienkāršs: katra vērtība no $_GET, $_POST, $_COOKIE, $_FILES un $_SERVER HTTP_ ierakstiem ir sveša ievade. Tā tiek pārbaudīta pieņemšanas brīdī un izvadē atbilstoši maskēta.
<?php
declare(strict_types=1);
// Sagaidāms vesels skaitlis: pārbaudīt, nevis akli pārveidot
$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');
}
// Atļaut tikai pieļaujamās vērtības
$sortierung = in_array($_GET['sort'] ?? '', ['name', 'datum'], true)
? $_GET['sort']
: 'datum';
// Izvadi vienmēr maskēt
echo htmlspecialchars($_POST['kommentar'] ?? '', ENT_QUOTES, 'UTF-8');
Bieži šķērslis ir norādes par pieprasījuma izcelsmi. Ja pirms tīmekļa servera atrodas reverse proxy, slodzes līdzsvarotājs vai CDN, $_SERVER['REMOTE_ADDR'] satur šī starpnieka adresi, nevis apmeklētāja adresi. Īstā adrese tad atrodas galvenē, piemēram, X-Forwarded-For, ko tomēr katrs klients var iestatīt pats. Lietojumprogramma šādas galvenes drīkst izvērtēt tikai tad, ja pieprasījums pierādāmi nāk no sava, zināma starpniekservera. Citādi bloķēšanu pēc IP adreses vai protokolus var viegli maldināt. Līdzīgi ir ar HTTPS: ja šifrēšana beidzas starpniekserverī, lietojumprogrammai skaidri jāzina, ka sākotnējais savienojums bija šifrēts.
Citus validācijas un filtrēšanas paraugus rāda raksts Ievades validācija un filtrēšana PHP. Sesijas datiem $_SESSION ir spēkā savi noteikumi; tie atrodami lapā Sesijas un sīkdatnes PHP.
Superglobālie mainīgie un PHP2Shell: kas notiek pirms jūsu koda
Šeit ir saikne ar pašreizējo situāciju. CVE-2026-109618 apraksta, ka Out-of-Memory stāvoklis var pārtraukt PHP brīdī, kad pieprasījuma dati ir inicializēti tikai daļēji; pieprasījuma sakopšanas laikā nederīgi dati tad var tikt uzskatīti par derīgiem. CVE-2026-109619 gadījumā pieprasījuma iekšējais stāvoklis pēc atmiņas atbrīvošanas var saglabāties un to var izmantot vēlāks pieprasījums tajā pašā darbprocesā (worker).
Abas ievainojamības tātad atrodas apstrādē, ko PHP pats veic ap pieprasījumu, nevis lietojumprogrammas kodā. PHP komanda risku mod_php gadījumā vērtē visaugstāk; tur exploit tika demonstrēts, vēl pirms tiek izpildīts lietojumprogrammas kods. Neviens filter_var() un neviena pārbaude lietojumprogrammā to nevar novērst.
Obligāts ir atjauninājums uz PHP 8.5.12, 8.4.27, 8.3.36 vai 8.2.35 un visu PHP procesu pārstartēšana. php.net pagaidu pasākumi, piemēram, šaurākas robežas post_max_size, nav pilnīga aizsardzība.
Kā PHP SOS palīdz konkrēti?
- Mēs katrai vietnei pārbaudām spēkā esošās pieprasījuma datu robežvērtības un iestatām tās atbilstoši lietojumprogrammai.
- Mēs ieviešam PHP atjauninājumu, pārstartējam visus darbprocesus un ielāpu stāvokli pierādām mūsu PHP ielāpošanas pakalpojuma ietvaros.
- Mēs paštaisītus risinājumus pārbaudām uz to, vai vērtības no superglobālajiem mainīgajiem bez pārbaudes nonāk datubāzē, failu sistēmā vai izvadē.
- Mēs nodrošinām tīmekļa servera žurnālus no 2026. gada 20. oktobra, lai vēlāka izvērtēšana paliktu iespējama.
Biežāk uzdotie jautājumi
Cik superglobālo mainīgo ir PHP?
PHP rokasgrāmata min deviņus: $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST un $_ENV. Tie ir pieejami katrā darbības apgabalā, arī funkcijās un metodēs.
Vai vērtībām $_SERVER var uzticēties?
Tikai daļēji. Ieraksti, kas sākas ar HTTP_, nāk no klienta pieprasījuma galvenēm. Rokasgrāmata brīdina, piemēram, ka SERVER_NAME var atspoguļot klienta piegādāto saimniekdatora nosaukumu un drošības lēmumiem nav uzticams.
Kāpēc $_POST dažreiz ir tukšs, kaut gan veidlapa tika nosūtīta?
Biežākais iemesls ir pieprasījums, kas lielāks par post_max_size. Tad $_POST un $_FILES saskaņā ar rokasgrāmatu paliek tukši. Uz to noved arī izslēgts iestatījums enable_post_data_reading.
Vai $_REQUEST vajadzētu izmantot?
Labāk ne. $_REQUEST sajauc datus no dažādiem avotiem, un kurš avots uzvar, atkarīgs no request_order un variables_order. Vērtības lasiet mērķtiecīgi no $_GET vai $_POST.