Signatur
Beschreibung
$_REQUEST ist eine superglobale Variable, die PHP automatisch beim Start jedes Skripts befüllt. Sie vereint die Eingaben aus $_GET, $_POST und $_COOKIE in einem einzigen assoziativen Array. Die Reihenfolge, in der Konflikte zwischen den Quellen aufgelöst werden (d. h. welche Quelle bei gleichem Schlüsselnamen gewinnt), wird durch die php.ini-Direktive request_order (ab PHP 5.3) bzw. variables_order gesteuert.
Der praktische Nutzen von $_REQUEST liegt darin, Formulare oder API-Endpunkte zu schreiben, die sowohl per GET als auch per POST aufgerufen werden können, ohne den Zugriffscode zu duplizieren. In vielen modernen Projekten wird jedoch bevorzugt, explizit auf $_GET oder $_POST zuzugreifen, um die Herkunft der Daten klar zu machen.
Wie alle Eingaben aus dem HTTP-Request dürfen die Werte in $_REQUEST niemals ohne vorherige Validierung und Bereinigung weiterverwendet werden. Besonders bei der Ausgabe in HTML (XSS) oder bei Datenbankabfragen (SQL-Injection) ist größte Vorsicht geboten. $_COOKIE-Daten in $_REQUEST sind zudem clientseitig manipulierbar.
Ab PHP 5.3 kann durch Setzen von request_order = "GP" in der php.ini der Cookie-Anteil vollständig aus $_REQUEST ausgeschlossen werden, was die Sicherheit erhöht, da Cookies vom Client beliebig gesetzt werden können.
Beispiele
Formularwert unabhängig von GET oder POST auslesen
<?php
// Funktioniert unabhängig davon, ob das Formular mit method="get" oder method="post" abgesendet wurde
$username = $_REQUEST['username'] ?? '';
// Eingabe bereinigen, bevor sie weiterverwendet wird
$username = htmlspecialchars(trim($username), ENT_QUOTES, 'UTF-8');
if ($username !== '') {
echo 'Hallo, ' . $username . '!';
} else {
echo 'Kein Benutzername übermittelt.';
}
Explizite Quellenprüfung als sicherere Alternative
<?php
// Besser: gezielt auf die erwartete Quelle prüfen
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$search = $_POST['q'] ?? '';
} else {
$search = $_GET['q'] ?? '';
}
$search = htmlspecialchars(trim($search), ENT_QUOTES, 'UTF-8');
echo 'Suchanfrage: ' . $search;
// Im Gegensatz dazu die kürzere, aber weniger explizite Variante:
$search2 = htmlspecialchars(trim($_REQUEST['q'] ?? ''), ENT_QUOTES, 'UTF-8');
echo PHP_EOL . 'Über $_REQUEST: ' . $search2;
Konfigurationseinfluss von request_order demonstrieren
<?php
// In php.ini: request_order = "GPC" (Standard)
// Bei gleichnamigem Schlüssel gewinnt die zuletzt gelistete Quelle (hier: Cookie)
// Simulationsbeispiel – im echten Request würden GET/POST/Cookie konkurrieren:
// GET: q=from_get
// POST: q=from_post
// Cookie: q=from_cookie
// Mit request_order="GPC" enthält $_REQUEST['q'] den Cookie-Wert.
// Mit request_order="GP" ist keine Cookie-Überschreibung möglich.
$value = $_REQUEST['q'] ?? 'nicht vorhanden';
echo 'Wert aus $_REQUEST: ' . htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
// Wichtig · Fallstricke
Sicherheitshinweis: Da $_REQUEST Daten aus mehreren Quellen kombiniert – darunter vom Client vollständig kontrollierbare Cookies –, ist die Herkunft eines Wertes nicht eindeutig nachvollziehbar. In sicherheitskritischen Anwendungen sollte immer $_POST oder $_GET direkt verwendet werden, um die Angriffsfläche zu reduzieren.
- XSS: Alle Werte müssen vor der HTML-Ausgabe mit
htmlspecialchars()escaped werden. - SQL-Injection: Niemals rohe
$_REQUEST-Werte in SQL-Abfragen einsetzen – stets Prepared Statements verwenden. - Cookie-Konflikt: Cookies können durch den Client manipuliert werden und dürfen GET- oder POST-Werte in
$_REQUESTüberschreiben (abhängig vonrequest_order). - In der
php.inikann mitrequest_order = "GP"der Cookie-Anteil entfernt werden (empfohlen).