Ajankohtainen tilanne: PHP2Shell. Kaksi kriittistä PHP-haavoittuvuutta (CVSS 9.2) sallii haittakoodin suorittamisen ilman kirjautumista. Korjaukset 21.10.2026 alkaen.Mitä nyt on tehtävä →

Superglobaalit: $_GET, $_POST, $_FILES ja muut

Superglobaalit ovat taulukoita, joiden kautta PHP-koodi saa pyyntötiedot. Kun tietää, miten PHP täyttää ne ja mitkä rajat pätevät, kirjoittaa turvallisempaa koodia ja ymmärtää PHP2Shelliä paremmin.

Tilanne Lukuaika 4 minPHP-tietoa

Lyhyesti: Superglobaalit ovat ennalta määriteltyjä taulukoita, jotka PHP täyttää automaattisesti jokaisella pyynnöllä ja jotka ovat käytettävissä koodin kaikkialla. $_GET sisältää osoitteen parametrit, $_POST lomaketiedot, $_FILES ladatut tiedostot, $_COOKIE evästeet ja $_SERVER tiedot pyynnöstä ja palvelimesta. PHP luo nämä taulukot ennen kuin sovelluskoodinne käynnistyy. Siksi juuri tämän käsittelyn aukkoja, kuten PHP2Shellin, ei voi torjua sovelluksen tarkistuksilla.

Mitä superglobaalit ovat?

PHP:ssä muuttuja pätee normaalisti vain siinä funktiossa, jossa se on luotu. Superglobaalit ovat poikkeus: ne ovat käytettävissä jokaisessa näkyvyysalueessa ilman, että niitä tarvitsee noutaa global-sanalla. PHP-käsikirja mainitsee niitä yhdeksän.

Ei-teknisille lukijoille sen voi kuvata näin: superglobaalit ovat sovelluksen postilaatikko. Kaikki, mitä kävijä lähettää, päätyy sinne ennen kuin sovellus lukee sen. Ja kaikki postilaatikossa voi olla peräisin tuntemattomalta.

Superglobaalit yleiskatsauksena

Superglobaali Sisältö Alkuperä
$_GET osoitteen parametrit (query string) asiakas
$_POST POST-pyynnön lomakekentät asiakas
$_FILES tiedot ladatuista tiedostoista asiakas, PHP:n jäsentämä
$_COOKIE selaimen mukana lähettämät evästeet asiakas
$_REQUEST sekoitus GET-, POST- ja tarvittaessa evästetietoja asiakas
$_SERVER pyyntöotsakkeet, metodi, polut, palvelintiedot verkkopalvelin ja asiakas sekaisin
$_ENV ympäristömuuttujat palvelin
$_SESSION nykyisen istunnon tiedot palvelimen tallennus
$GLOBALS kaikki globaalit muuttujat komentosarja

Erityisen salakavala on $_SERVER. Käsikirjan mukaan PHP luo jokaisesta pyyntöotsakkeesta merkinnän, jonka alussa on HTTP_, esimerkiksi HTTP_USER_AGENT. Nämä arvot asettaa asiakas itse. Myös SERVER_NAME voi käsikirjan mukaan sisältää asiakkaan antaman isäntänimen eikä se ole luotettava tietoturvapäätöksiin.

Miten PHP täyttää superglobaalit

Ennen kuin komentosarjanne ensimmäistäkään merkkiä suoritetaan, PHP on jo työskennellyt. Se lukee osoitteen, otsakkeet ja pyynnön sisällön, pilkkoo ne ja tallentaa tulokset taulukoihin. Useat asetukset ohjaavat tätä vaihetta:

  1. variables_order (oletus EGPCS) määrittää, mitkä superglobaalit ylipäätään luodaan: Environment, GET, POST, Cookie, Server.
  2. request_order (oletus tyhjä) määrää, mistä $_REQUEST muodostetaan. Jos se on tyhjä, pätee variables_order. Mukana toimitetut php.ini-tiedostot jättävät evästeet käsikirjan mukaan pois tietoturvasyistä.
  3. max_input_vars (oletus 1000) ja max_input_nesting_level (oletus 64) rajoittavat syötemuuttujien määrää ja sisäkkäisyyttä.
  4. post_max_size (oletus 8M) rajoittaa pyynnön sisältöä. Jos pyyntö on suurempi, $_POST ja $_FILES jäävät tyhjiksi.
  5. enable_post_data_reading (oletus päällä) ohjaa, arvioiko PHP POST-pyyntöjen sisällön ylipäätään automaattisesti.

Jos enable_post_data_reading on sammutettu, sovellus lukee raakasisällön itse kautta php://input. Versiosta PHP 8.4.0 lähtien on lisäksi request_parse_body(), joka jäsentää lomake- ja latausdataa myös muille metodeille kuin POST ja sallii omat raja-arvot. Miten latausosa tarkemmin etenee, selittää sivu Miten PHP käsittelee tiedostolataukset.

Pyyntötietojen turvallinen käsittely

Periaate on yksinkertainen: jokainen arvo muuttujista $_GET, $_POST, $_COOKIE, $_FILES ja $_SERVER-muuttujan HTTP_-merkinnöistä on vierasta syötettä. Se tarkistetaan vastaanotettaessa ja suojataan sopivasti tulostettaessa.

<?php
declare(strict_types=1);

// Odotetaan kokonaislukua: tarkista sokean muunnoksen sijaan
$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');
}

// Salli vain sallitut arvot
$sortierung = in_array($_GET['sort'] ?? '', ['name', 'datum'], true)
    ? $_GET['sort']
    : 'datum';

// Suojaa tuloste aina
echo htmlspecialchars($_POST['kommentar'] ?? '', ENT_QUOTES, 'UTF-8');

Yleinen kompastuskivi ovat pyynnön alkuperää koskevat tiedot. Jos verkkopalvelimen edessä on käänteinen välityspalvelin, kuormantasaaja tai CDN, $_SERVER['REMOTE_ADDR'] sisältää tämän välittäjän osoitteen, ei kävijän. Todellinen osoite on silloin otsakkeessa kuten X-Forwarded-For, jonka kuka tahansa asiakas voi kuitenkin itse asettaa. Sovellus saa käsitellä tällaisia otsakkeita vain, jos pyyntö todistettavasti tulee omalta, tunnetulta välityspalvelimelta. Muuten IP-osoitteeseen perustuvat estot tai lokit on helppo johtaa harhaan. Samoin HTTPS-arvon kohdalla: jos salaus päättyy välityspalvelimeen, sovelluksen on nimenomaisesti tiedettävä, että alkuperäinen yhteys oli salattu.

Lisää tarkistuksen ja suodatuksen malleja näyttää artikkeli Syötteiden tarkistus ja suodatus PHP:ssä. $_SESSION-muuttujan istuntotiedoille pätevät omat sääntönsä; ne ovat sivulla Istunnot ja evästeet PHP:ssä.

Superglobaalit ja PHP2Shell: mitä tapahtuu ennen koodiasi

Tässä on yhteys nykytilanteeseen. CVE-2026-109618 kuvaa, että Out-of-Memory-tila voi keskeyttää PHP:n, kun pyyntötiedot on alustettu vain osittain; pyynnön siivouksessa virheellisiä tietoja voidaan sitten käsitellä kelvollisina. Haavoittuvuudessa CVE-2026-109619 pyynnön sisäinen tila voi säilyä muistin vapauttamisen jälkeen ja myöhempi pyyntö samassa workerissa voi käyttää sitä.

Molemmat aukot ovat siis siinä käsittelyssä, jonka PHP itse suorittaa pyynnön ympärillä, ei sovelluskoodissa. PHP-tiimi arvioi riskin korkeimmaksi mod_php:ssä; siinä on esitetty hyökkäys, joka toimii ennen kuin sovelluskoodia ajetaan. Mikään filter_var() eikä sovelluksen tarkistus voi estää sitä.

Toimi heti

Pakollista on päivitys versioon PHP 8.5.12, 8.4.27, 8.3.36 tai 8.2.35 ja kaikkien PHP-prosessien uudelleenkäynnistys. Php.netin väliaikaistoimet, esimerkiksi tiukemmat rajat asetukselle post_max_size, eivät ole täydellinen suoja.

Miten PHP SOS auttaa konkreettisesti?

  • Tarkistamme pyyntötietojen voimassa olevat raja-arvot verkkosivustoittain ja asetamme ne sovellukseen sopiviksi.
  • Asennamme PHP-päivityksen, käynnistämme kaikki workerit uudelleen ja osoitamme korjaustason PHP-päivityspalvelumme puitteissa.
  • Tarkistamme omat kehitystyöt sen varalta, päätyvätkö superglobaalien arvot tarkistamattomina tietokantaan, tiedostojärjestelmään tai tulosteeseen.
  • Turvaamme verkkopalvelimen lokit 20.10.2026 alkaen, jotta myöhempi analyysi pysyy mahdollisena.

Usein kysytyt kysymykset

Kuinka monta superglobaalia PHP:ssä on?

PHP-käsikirja mainitsee yhdeksän: $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST ja $_ENV. Ne ovat käytettävissä jokaisessa näkyvyysalueessa, myös funktioissa ja metodeissa.

Ovatko $_SERVER-muuttujan arvot luotettavia?

Vain osittain. Merkinnät, jotka alkavat HTTP_, tulevat asiakkaan pyyntöotsakkeista. Käsikirja varoittaa esimerkiksi, että SERVER_NAME voi heijastaa asiakkaan antamaa isäntänimeä eikä se ole luotettava tietoturvapäätöksiin.

Miksi $_POST on joskus tyhjä, vaikka lomake lähetettiin?

Yleisin syy on pyyntö, joka on suurempi kuin post_max_size. Silloin $_POST ja $_FILES jäävät käsikirjan mukaan tyhjiksi. Myös sammutettu asetus enable_post_data_reading aiheuttaa saman.

Pitäisikö $_REQUEST-muuttujaa käyttää?

Mieluummin ei. $_REQUEST sekoittaa tietoja eri lähteistä, ja se, mikä lähde voittaa, riippuu asetuksista request_order ja variables_order. Lukekaa arvot kohdennetusti muuttujista $_GET tai $_POST.

Lähteet

Pikayhteys

Jokainen tunti on tärkeä. Kirjoittakaa meille nyt.

Kuvatkaa lyhyesti järjestelmä, PHP-versio ja havainnot. Otamme yhteyttä, selvitämme tilanteen ja työskentelemme etänä, kunnes tapaus on käsitelty loppuun ja dokumentoitu.

Pikaapu