Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

Superglobālie mainīgie: $_GET, $_POST, $_FILES un citi

Superglobālie mainīgie ir masīvi, caur kuriem PHP kods iegūst pieprasījuma datus. Kas zina, kā PHP tos aizpilda un kādas robežas ir spēkā, raksta drošāku kodu un labāk saprot PHP2Shell.

Aktuāls uz 4 min lasīšanas laiksPHP zināšanas

Ī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:

  1. variables_order (noklusējums EGPCS) nosaka, kuri superglobālie mainīgie vispār tiek izveidoti: Environment, GET, POST, Cookie, Server.
  2. 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ž.
  3. max_input_vars (noklusējums 1000) un max_input_nesting_level (noklusējums 64) ierobežo ievades mainīgo skaitu un ligzdošanu.
  4. post_max_size (noklusējums 8M) ierobežo pieprasījuma saturu. Ja pieprasījums ir lielāks, $_POST un $_FILES paliek tukši.
  5. 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.

Rīkoties nekavējoties

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.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība