# Superglobaalit: $_GET, $_POST, $_FILES ja muut

> PHP-superglobaalit: mitä $_GET, $_POST, $_FILES ja $_SERVER sisältävät, miten PHP täyttää ne ennen koodiasi ja miten pyyntötietoja käytetään turvallisesti.

Lähde: https://phpsos.de/fi/php/superglobals/  
Tilanne: 25.10.2026  
Palveluntarjoaja: PHP SOS, PHP-hätäapu ja palvelimen tietoturva. Pikaapu WhatsAppilla: https://wa.me/491736494914?text=Hei%20PHP%20SOS%2C%20tarvitsemme%20apua%20PHP-palvelimemme%20kanssa.%20Yritys%3A%20%E2%80%A6%20Verkkosivusto%3A%20%E2%80%A6

**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](https://phpsos.de/fi/php/datei-uploads-intern/).

## 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
<?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ä](https://phpsos.de/fi/blog/eingaben-validieren-php/). `$_SESSION`-muuttujan istuntotiedoille pätevät omat sääntönsä; ne ovat sivulla [Istunnot ja evästeet PHP:ssä](https://phpsos.de/fi/php/sessions-und-cookies/).

## Superglobaalit ja PHP2Shell: mitä tapahtuu ennen koodiasi

Tässä on yhteys nykytilanteeseen. [CVE-2026-109618](https://phpsos.de/fi/php2shell/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](https://phpsos.de/fi/leistungen/php-patch-service/) 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

- [PHP-käsikirja: superglobaalit](https://www.php.net/manual/de/language.variables.superglobals.php)
- [PHP-käsikirja: $_SERVER](https://www.php.net/manual/en/reserved.variables.server.php)
- [PHP-käsikirja: php.ini-direktiivit](https://www.php.net/manual/de/ini.core.php)
- [PHP-käsikirja: request_parse_body](https://www.php.net/manual/en/function.request-parse-body.php)
