Actuele situatie: PHP2Shell. Twee kritieke PHP-kwetsbaarheden (CVSS 9.2) maken schadelijke code zonder inloggen mogelijk. Patches sinds 21-10-2026.Wat u nu moet doen →

Superglobals: $_GET, $_POST, $_FILES en co.

Superglobals zijn de arrays waarmee PHP-code bij verzoekgegevens komt. Wie weet hoe PHP ze vult en welke grenzen gelden, schrijft veiligere code en begrijpt PHP2Shell beter.

Stand 5 min. leestijdPHP-kennis

Kort gezegd: Superglobals zijn vooraf gedefinieerde arrays die PHP bij elk verzoek automatisch vult en die overal in de code beschikbaar zijn. $_GET bevat de parameters uit het adres, $_POST de formuliergegevens, $_FILES geüploade bestanden, $_COOKIE de cookies en $_SERVER gegevens over verzoek en server. PHP maakt deze arrays aan voordat uw toepassingscode start. Daarom kunnen lekken in precies deze verwerking, zoals bij PHP2Shell, niet door controles in de toepassing worden opgevangen.

Wat zijn superglobals?

In PHP geldt een variabele normaal gesproken alleen in de functie waarin ze is aangemaakt. Superglobals zijn de uitzondering: ze zijn in elk geldigheidsbereik beschikbaar, zonder dat men ze met global hoeft op te halen. De PHP-handleiding noemt er negen.

Voor niet-technici is dat zo te beschrijven: de superglobals zijn de brievenbus van de toepassing. Alles wat een bezoeker stuurt, belandt daar voordat de toepassing het leest. En alles in de brievenbus komt potentieel van een vreemde.

De superglobals in overzicht

Superglobal Inhoud Herkomst
$_GET parameters uit het adres (query string) client
$_POST formuliervelden van een POST-verzoek client
$_FILES gegevens over geüploade bestanden client, door PHP verwerkt
$_COOKIE door de browser meegestuurde cookies client
$_REQUEST mengsel van GET, POST en eventueel cookies client
$_SERVER verzoekheaders, methode, paden, servergegevens webserver en client gemengd
$_ENV omgevingsvariabelen server
$_SESSION gegevens van de huidige sessie serveropslag
$GLOBALS alle globale variabelen script

Bijzonder verraderlijk is $_SERVER. Volgens de handleiding maakt PHP voor elke verzoekheader een vermelding met HTTP_ aan het begin, bijvoorbeeld HTTP_USER_AGENT. Deze waarden stelt de client zelf in. Ook SERVER_NAME kan volgens de handleiding de door de client geleverde hostnaam bevatten en is voor beveiligingsbeslissingen niet betrouwbaar.

Hoe PHP de superglobals vult

Voordat het eerste teken van uw script wordt uitgevoerd, heeft PHP al gewerkt. Het leest het adres, de headers en de inhoud van het verzoek, ontleedt ze en legt de resultaten in de arrays. Meerdere instellingen sturen deze stap aan:

  1. variables_order (standaard EGPCS) bepaalt welke superglobals worden aangemaakt: Environment, GET, POST, Cookie, Server.
  2. request_order (standaard leeg) bepaalt waaruit $_REQUEST wordt gevormd. Is het leeg, dan geldt variables_order. De meegeleverde php.ini-bestanden laten cookies volgens de handleiding om veiligheidsredenen weg.
  3. max_input_vars (standaard 1000) en max_input_nesting_level (standaard 64) beperken aantal en nesting van de invoervariabelen.
  4. post_max_size (standaard 8M) beperkt de verzoekinhoud. Is een verzoek groter, dan blijven $_POST en $_FILES leeg.
  5. enable_post_data_reading (standaard aan) bepaalt of PHP de inhoud van POST-verzoeken automatisch verwerkt.

Is enable_post_data_reading uitgeschakeld, dan leest de toepassing de ruwe inhoud zelf via php://input. Sinds PHP 8.4.0 is er bovendien request_parse_body(), dat formulier- en uploadgegevens ook voor andere methoden dan POST verwerkt en eigen grenswaarden toestaat. Hoe het uploadgedeelte in detail verloopt, legt de pagina Hoe PHP bestandsuploads verwerkt uit.

Veilig omgaan met verzoekgegevens

Het uitgangspunt is eenvoudig: elke waarde uit $_GET, $_POST, $_COOKIE, $_FILES en de HTTP_-vermeldingen van $_SERVER is een vreemde invoer. Ze wordt bij aanname gecontroleerd en bij uitvoer passend geëscaped.

<?php
declare(strict_types=1);

// Geheel getal verwacht: controleren in plaats van blind omzetten
$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');
}

// Alleen toegestane waarden toelaten
$sortierung = in_array($_GET['sort'] ?? '', ['name', 'datum'], true)
    ? $_GET['sort']
    : 'datum';

// Uitvoer altijd escapen
echo htmlspecialchars($_POST['kommentar'] ?? '', ENT_QUOTES, 'UTF-8');

Een veelvoorkomend struikelblok zijn gegevens over de herkomst van een verzoek. Staat vóór de webserver een reverse proxy, een load balancer of een CDN, dan bevat $_SERVER['REMOTE_ADDR'] het adres van die tussenpersoon, niet dat van de bezoeker. Het echte adres staat dan in een header als X-Forwarded-For, die echter elke client zelf kan instellen. De toepassing mag zulke headers alleen verwerken als het verzoek aantoonbaar van een eigen, bekende proxy komt. Anders zijn blokkades op IP-adres of logboeken gemakkelijk te misleiden. Iets vergelijkbaars geldt voor HTTPS: eindigt de versleuteling bij de proxy, dan moet de toepassing uitdrukkelijk weten dat de oorspronkelijke verbinding versleuteld was.

Verdere patronen voor validatie en filtering toont het artikel Invoer in PHP valideren en filteren. Voor sessiegegevens in $_SESSION gelden eigen regels; ze staan op de pagina Sessies en cookies in PHP.

Superglobals en PHP2Shell: wat vóór uw code gebeurt

Hier ligt het verband met de actuele situatie. CVE-2026-109618 beschrijft dat een out-of-memory-toestand PHP kan onderbreken terwijl verzoekgegevens maar gedeeltelijk zijn geïnitialiseerd; bij het opruimen van het verzoek kunnen ongeldige gegevens dan als geldig worden behandeld. Bij CVE-2026-109619 kan de interne toestand van een verzoek na het vrijgeven van het geheugen blijven bestaan en door een later verzoek in dezelfde worker worden gebruikt.

Beide lekken zitten dus in de verwerking die PHP zelf rond het verzoek uitvoert, niet in de toepassingscode. Het PHP-team schat het risico bij mod_php het hoogst in; daar is een exploit gedemonstreerd voordat er ook maar toepassingscode draait. Geen enkele filter_var() en geen enkele controle in de toepassing kan dat voorkomen.

Direct handelen

Verplicht is de update naar PHP 8.5.12, 8.4.27, 8.3.36 of 8.2.35 en de herstart van alle PHP-processen. De tussenmaatregelen van php.net, bijvoorbeeld krappere grenzen voor post_max_size, zijn geen volledige bescherming.

Hoe helpt PHP SOS concreet?

  • Wij controleren de werkzame grenswaarden voor verzoekgegevens per website en stellen ze passend bij de toepassing in.
  • Wij installeren de PHP-update, starten alle workers opnieuw en leggen de patchstand vast in het kader van onze PHP-patchservice.
  • Wij controleren maatwerk erop of waarden uit superglobals ongecontroleerd in database, bestandssysteem of uitvoer terechtkomen.
  • Wij beveiligen de weblogs vanaf 20-10-2026, zodat een latere analyse mogelijk blijft.

Veelgestelde vragen

Hoeveel superglobals zijn er in PHP?

De PHP-handleiding noemt er negen: $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST en $_ENV. Ze zijn in elk geldigheidsbereik beschikbaar, ook in functies en methoden.

Zijn waarden in $_SERVER betrouwbaar?

Slechts gedeeltelijk. Vermeldingen met HTTP_ aan het begin komen uit de verzoekheaders van de client. De handleiding waarschuwt bijvoorbeeld dat SERVER_NAME de door de client geleverde hostnaam kan weerspiegelen en voor beveiligingsbeslissingen niet betrouwbaar is.

Waarom is $_POST soms leeg, hoewel een formulier is verzonden?

Meest voorkomende oorzaak is een verzoek dat groter is dan post_max_size. Dan blijven $_POST en $_FILES volgens de handleiding leeg. Ook een uitgeschakelde instelling enable_post_data_reading leidt daartoe.

Moet men $_REQUEST gebruiken?

Liever niet. $_REQUEST mengt gegevens uit verschillende bronnen, en welke bron wint, hangt af van request_order en variables_order. Lees waarden gericht uit $_GET of $_POST.

Bronnen

Direct contact

Elk uur telt. Schrijf ons nu.

Beschrijf kort het systeem, de PHP-versie en wat u opmerkt. Wij nemen contact op, brengen de situatie in kaart en werken op afstand tot het incident is afgerond en gedocumenteerd.

Directe hulp